侵入式智能指针和非侵入式智能指针

一直有个疑问,为什么chromium代码没有使用shared_ptr呢?

在这里讨论:https://groups.google.com/a/chromium.org/g/cxx/c/aT2wsBLKvzI

不过我在这里找到了一个简单的答案:
https://groups.google.com/a/chromium.org/g/chromium-dev/c/hgQPkvSmYlE?pli=1

1、 scoped_refptr是一种侵入式的智能指针。

2、 因为chromium不鼓励使用智能指针,所以也不希望任何类型都可以使用引用计数,所以只针对需要引用计数的类型来使用scoped_refptr。(如果引入了shared_ptr,那么任何类型都可以使用引用计数了)

3、 性能稍微好一点

对于侵入式和非侵入式智能指针,我第一次听说,所以查资料学习了下:invasive vs non-invasive ref-counted pointers in C++ - Stack Overflow

简单来总结一下:

侵入式智能指针:

1、 计数器嵌入在对象内部;

2、 需要自己确保线程安全(不是必须的);

3、 引用计数不可能在对象生命周期之外存在,所以也就没有所谓的weakptr了。

典型的侵入式智能指针代码像COM智能指针:CComPtr

或者是上面文章给出的boost::intrusive_ptr:intrusive_ptr - 1.42.0

再有就是chromium中的 scoped_refptr:https://chromium.googlesource.com/chromium/src/+/master/base/memory/scoped_refptr.h

非侵入式智能指针:

典型的就是std::shared_ptr,他的引用计数不用对象来保存(比如std::shared_ptr<MyClass> my_class中,MyClass类中没有引用计数)。

他的引用计数是在类shared_ptr中保存,在堆上申请,在所有shared_ptr实例中共享。

既然他的引用计数不在MyClass对象上保存,所以MyClass析构了,引用计数还可以保存下来,这就可以非常简单的实现weak_ptr来确保没有循环引用。

但是这个在侵入式智能指针就不行了,因为MyClass析构以后,引用计数也析构了。

侵入式 vs. 非侵入式:

侵入式的好处:计数器和对象内存是在一起的,不需要两个堆内存

侵入式的坏处:需要小心循环引用的问题,主要原因是引用计数在对象内部保存,对象销毁了引用计数也就没有了,不容易实现像std::weak_ptr的对std::shared_ptr引用计数的感知。

非侵入式的好处:使用起来比较简单,对任何类型都可以支持,使用weak_ptr很好的解决了循环引用问题

非侵入式的坏处:引用计数和对象一般是分离的,需要两次申请,不过如果使用std::make_shared(...)可以优化在一起。

参考文档:
关于侵入式和非侵入式_侵入式指针-CSDN博客

https://www.cnblogs.com/cswuyg/archive/2013/03/05/2943648.html

相关推荐
云边有个稻草人17 分钟前
Tera Term 鸿蒙 PC 适配全记录:用 ArkUI 与 Native C++ 重建多协议终端工作流
c++·stm32·harmonyos
牛油果子哥q18 分钟前
多模态大模型工程入门:图文Embedding、图文RAG、图片解析、C++多模态接口封装实战
开发语言·c++·embedding
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 134. 加油站 | C++ 贪心算法与局部否决逻辑
c++·leetcode·贪心算法
夜不会漫长1 小时前
C++:类和对象(1)
java·开发语言·c++
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 274. H 指数 | C++ 二分答案法 (单调性降维打击)
c++·算法·leetcode
码匠许师傅3 小时前
【C++三方组件】nlohmann/json:像写 STL 一样操作 JSON
c++
Yingye Zhu(HPXXZYY)3 小时前
洛谷B4337 [中山市赛 2023] 简单数学题
c++·算法
郝学胜-神的一滴3 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
开发语言·数据结构·c++·软件工程·visual studio
m0_734571763 小时前
深入理解C++ 析构函数<四>虚析构函数
开发语言·c++
学习智者3 小时前
《玄》IDE v3.8.2重磅发布:数据外置+全链路优化
开发语言·c++·ide·中文语言 玄