以下内容为本人的烂笔头,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/Rk2-tjIIbUh6yylPHZzEEg
本文上接《C++ 代码之性能空间极限拉扯:「COW」 真乃神助攻(上)》
优化
在上面的简单实现里,有个假设是,每次调用 SmartRef 默认函数创建实例都会再次创建一个独立的数据集 Data,这样有点浪费空间,运行效率也可以继续优化。
默认的实例大可以共享数据集,所以可以借鉴「单例模式」的思想,在调用 SmartRef 默认函数创建实例时,直接共享默认的数据集。如果默认数据集未创建,则创建之,默认数据集在进程内只有一个实例。
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 特性的加持下,一旦调用写接口就会触发数据集的深拷贝,这时数据集自动隔离。