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 的解读过程,自己实现拷贝的优化,当然笔者也愿意和你进一步探讨这方面的问题。

相关推荐
wefg11 分钟前
【C++】类与对象
开发语言·c++
子豪-中国机器人27 分钟前
C++ 蓝桥 STEMA 省选拔赛模拟测试题(第一套)
开发语言·c++·算法
虾球xz32 分钟前
游戏引擎学习第286天:开始解耦实体行为
c++·人工智能·学习·游戏引擎
zh_xuan3 小时前
c++ 类的语法3
开发语言·c++
一律清风4 小时前
【Opencv】canny边缘检测提取中心坐标
c++·opencv
a东方青8 小时前
蓝桥杯 2024 C++国 B最小字符串
c++·职场和发展·蓝桥杯
XiaoyaoCarter9 小时前
每日一道leetcode
c++·算法·leetcode·职场和发展·二分查找·深度优先·前缀树
galaxy_strive9 小时前
qtc++ qdebug日志生成
开发语言·c++·qt
Darkwanderor10 小时前
c++STL-list的模拟实现
c++·list
Humbunklung10 小时前
Visual Studio 2022 中添加“高级保存选项”及解决编码问题
前端·c++·webview·visual studio