C++ 代码之性能空间极限拉扯:「COW」 真乃神助攻(下)

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」mp.weixin.qq.com/s/Rk2-tjIIb...

优化

在上面的简单实现里,有个假设是,每次调用 SmartRef 默认函数创建实例都会再次创建一个独立的数据集 Data,这样有点浪费空间,运行效率也可以继续优化。

默认的实例大可以共享数据集,所以可以借鉴「单例模式」的思想,在调用 SmartRef 默认函数创建实例时,直接共享默认的数据集。如果默认数据集未创建,则创建之,默认数据集在进程内只有一个实例。

arduino 复制代码
class SmartRef
{
    // ...
private:
    // ...
    static Data* CommonData();
};

SmartRef::SmartRef()
        : data_(CommonData()) {
    ++ data_->count_;
}

SmartRef::Data* SmartRef::CommonData()
{
    static Data *p = nullptr;
    if (nullptr == p) {
        p = new Data();
        ++ p->count_;
    }
    return p;
}

虽然这样的改进是共享默认数据集,但 SmartRef 各个不同实例对象之间的状态不会绑定,因为在 COW 特性的加持下,一旦调用写接口就会触发数据集的深拷贝,这时数据集自动隔离。

数据集派生

上面提到的数据集都是单个明确的类,如果被拷贝的数据集类型是多个派生类呢?有为什么非得是派生类呢?

比如在画板应用里,假设所有图形都是基于基类 shape 派生的类型,有 rectangle、circle、square、triangle 等。预先在画板里添加了一些不同类型的图形,有的是 rectangle,有的是 circle 等等。

读取各个具体图形时,因为系统不知道对应哪个具体的类,所有图形对象的指针都被当成基类 shape 的指针,想要复制任何一个具体图形时都无法清楚知道对应哪个类型,也就无法直接调用构造函数创建新的对象。

如何是好?

如果你是我的常读用户,你会发现笔者在之前的几篇技术文里对「虚拷贝构造函数」做过很详细介绍,「虚拷贝构造函数」就可以解决这个的问题。如果你对这方面的了解不够,不妨点击前往阅读一下: 《是不是看错了,C++ 构造函数也可以是虚函数?(上)》 《是不是看错了,C++ 构造函数也可以是虚函数?(下)》

面对不清楚类型的对象,执行拷贝的逻辑可以利用虚拷贝构造函数解决,但是效率还有待提高。正好,上文介绍的 COW 特性对 C++ 代码性能和空间利用的极限提升非常有意义。

各位读者朋友不妨仿照上面对 COW 的解读过程,自己实现拷贝的优化,当然笔者也愿意和你进一步探讨这方面的问题。

相关推荐
zmzb010332 分钟前
C++课后习题训练记录Day175
开发语言·c++
啦啦啦啦啦zzzz1 小时前
工具:动态类工厂和用配置文件存储属性
c++·设计模式·工具·动态工厂
脱胎换骨-军哥1 小时前
C++ 代码规范与格式化指南
开发语言·c++·代码规范
迷途之人不知返3 小时前
lambda表达式
c++
@三十一Y3 小时前
C++:红黑树的实现
开发语言·c++
_wyt0014 小时前
拓扑排序:有向无环图的排队艺术
c++·拓扑排序·队列
皓月斯语4 小时前
B2118 验证子串
c++·题解
乐观勇敢坚强的老彭4 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
2301_777998345 小时前
C/C++:预处理详解
c语言·c++
t-think5 小时前
C++类和对象详解(一)
开发语言·c++