C++ 代码之性能空间极限拉扯:「COW」 真乃神助攻(下)

以下内容为本人的烂笔头,如需要转载,请声明原文链接 微信公众号「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 特性的加持下,一旦调用写接口就会触发数据集的深拷贝,这时数据集自动隔离。

数据集派生<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值