一直有个疑问,为什么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析构以后,引用计数也析构了。