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

相关推荐
Wave8453 小时前
C++继承详解
开发语言·c++·算法
Tairitsu_H3 小时前
C++类基础概念:定义、实例化和this指针
开发语言·c++
不想写代码的星星3 小时前
C++17 string_view 观察报告:好用,但有点费命
c++
努力努力再努力wz3 小时前
【Linux网络系列】深入理解 I/O 多路复用:从 select 痛点到 poll 高并发服务器落地,基于 Poll、智能指针与非阻塞 I/O与线程池手写一个高性能 HTTP 服务器!(附源码)
java·linux·运维·服务器·c语言·c++·python
努力努力再努力wz3 小时前
【Linux网络系列】万字硬核解析网络层核心:IP协议到IP 分片重组、NAT技术及 RIP/OSPF 动态路由全景
java·linux·运维·服务器·数据结构·c++·python
minji...4 小时前
Linux 线程同步与互斥(四) POSIX信号量,基于环形队列的生产者消费者模型
linux·运维·服务器·c语言·开发语言·c++
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:拼数
c++·算法·贪心·csp·信奥赛·排序贪心·拼数
程序猿编码4 小时前
给Linux程序穿“隐身衣”——ELF运行时加密器全解析(C/C++代码实现)
linux·c语言·c++·网络安全·elf·内存安全
John_ToDebug4 小时前
从 Win10 到 Win11 22H2+:任务栏美化中的“蒙版”和“Hover 色块”渲染原理解析
c++·chrome·windows
谭欣辰5 小时前
AC自动机:多模式匹配的高效利器
数据结构·c++·算法