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

相关推荐
wo_jack1 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
D e re k ZH2 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
雪落漂泊3 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
不会算法的笨小孩5 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
Hhy_11077 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
青少儿编程课堂7 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
YSL0701247 小时前
C++基础
开发语言·c++
eggwyw8 小时前
关于C++为什么不加入垃圾回收机制解析
开发语言·c++
曦樂~18 小时前
Cpp面筋
c语言·c++
道尔柯南18 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++