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

相关推荐
Death20016 分钟前
Qt 6 相比 Qt 5 的主要提升与更新
开发语言·c++·qt·交互·数据可视化
麻辣韭菜2 小时前
网络基础 【HTTP】
网络·c++·http
阿史大杯茶2 小时前
Codeforces Round 976 (Div. 2 ABCDE题)视频讲解
数据结构·c++·算法
转调3 小时前
每日一练:地下城游戏
开发语言·c++·算法·leetcode
wdxylb4 小时前
使用C++的OpenSSL 库实现 AES 加密和解密文件
开发语言·c++·算法
CSP126364 小时前
特别节目————集训总结
c++
程序猿阿伟4 小时前
《C++游戏人工智能开发:开启智能游戏新纪元》
c++·人工智能·游戏
一线青少年编程教师5 小时前
线性表三——队列queue
数据结构·c++·算法
C5 小时前
C++_智能指针详解
开发语言·c++
qinzechen5 小时前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#