当前位置: 首页 > article >正文

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

一直有个疑问,为什么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


http://www.kler.cn/a/232614.html

相关文章:

  • 【C++学习(37)】并发性模式:如生产者-消费者、读写锁等。 架构模式:如MVC、MVVM等。属于23 种设计模式吗? RAII 的关系?
  • 简易入手《SOM神经网络》的本质与原理
  • MySQL(5)【数据类型 —— 字符串类型】
  • uniapp在app模式下组件传值
  • #include<string>和#include<string.h>有什么区别
  • 基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解
  • tsgctf-2021-lkgit-无锁竞争-userfaultfd
  • 【JavaWeb】头条新闻项目实现 基本增删改查 分页查询 登录注册校验 业务功能实现 第二期
  • python调用golang中函数方法
  • 面试高频知识点:2线程 2.1.6线程之间如何通信
  • 06 MP之自动填充+SQL执行的语句和速度分析
  • FreeRTOS中的任务上下文切换时间
  • 【OrangePi Zero2的系统移植】OrangePi Zero2 SDK说明
  • 2024年GPT如何发展?
  • 接口错误码以及对应的含义
  • Python进阶--爬取美女图片壁纸(基于回车桌面网的爬虫程序)
  • PostgreSql与Postgis安装
  • PS一键磨皮插件Delicious Retouch for mac中文 支持PS2024
  • 排序算法---快速排序
  • 如何正确理解和获取S参数
  • 【C语言】案例:输出n位水仙花数
  • 吉他学习:识谱,认识节奏,视唱节奏,节拍器的使用
  • Python爬虫http基本原理#2
  • 使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队
  • 【Spring源码解读!底层原理高级进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨
  • 自学Python第二十二天- Django框架(六) django的实用插件:cron、APScheduler