| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> STL源码阅读小记(五)——Shared_ptr -> 正文阅读 |
|
[C++知识库]STL源码阅读小记(五)——Shared_ptr |
前言感觉好久没看stl了,中间跑去看图形学入门了,图形学是真的有趣,但是也是真难,不过接着补坑,把unique_ptr的好兄弟shared_ptr也看了。 STL版本本文所使用的stl版本为libc++ 13.0,属于LLVM项目。 如果遇到不熟悉的宏定义可以参考文档Symbol Visibility Macros Shared_ptr应该算是c++中的老熟人,应该绝大部分人应该使用过,或者在面试中见过它,对它的引用计数器印象深刻吧。这次我们看看stl的源码中shared_ptr是怎么实现的。 定义,构造和赋值定义和关键成员
shared_ptr内部有两个比较关键的成员类型,一个是ptr,另一个是__shared_weak_count,前着存储指针,后者存储计数器,在两个源码我们等看完构造和拷贝构造函数再看吧。 __nat是用来和enable_if配合,检测自定义析构函数,但是有点疑惑为什么不在template定义位置做,而要在参数位置做,在c++11后已经支持模板函数的默认模板参数。也搜索不到有用的资料,这点等以后来验证吧。 构造函数先看一个最简单的构造函数,是参数为原始指针的构造
当参数为一个指针类型的时候,首先判断_Yp和_Tp是否为可转换,这里是智能指针为了萃取普通指针父子类可转换,以及_Tp不能为数组。 这里使用unique_ptr的原因我找了下,大致如下: unique_ptr is used for the purpose that unique pointer is typically used: To delete the pointer when it goes out of scope. In this case, the unique pointer is always released before the constructor returns normally and in that case it won’t delete the pointer. But that won’t happen when an exception is thrown. In that case the unique pointer will still own the pointer and will delete it in its destructor before the exception propagates to the caller. 大致意思是如果在执行中抛出了异常,unique_ptr能把指针释放。
拷贝构造函数接着我们看两个很有意思的拷贝构造函数的声明
第一个为自身同类型的拷贝构造,很容易看懂,而第二个是实现普通指针子类可以转为父类的拷贝构造。在参数位置使用默认参数进行SFINAE,理论上应该也是能放到默认模板位置。主要就算检查一下两种类型是否可以转换。 它们的定义几乎一样,所以就列一个啦
可以发现在执行拷贝构造函数时会复制ptr和计数器,然后对自身计数器加1。 这里的__add_shared()函数内部使用了
保证计数器的原子性,但是要注意的是shared_ptr不保证ptr的原子性。 引用计数器__shared_weak_count从前面shared_ptr的成员声明我们发现计数器类型是一个__shared_weak_count。
__shared_weak_count拥有_shared_weak_owners,而它的父类则拥有_shared_owners。 __shared_weak_count内部有两个关键的add函数
__add_shared函数被shared_ptr使用,而__add_weak被weak_ptr使用。 __shared_ptr_pointer但是,但是,但是重要的事情要说三次,__shared_weak_count并非shared_ptr实际上用到,实际上__shared_weak_count是一个父类,它的子类__shared_ptr_pointer才是shared_ptr真正使用的计数器,对于父类,__shared_ptr_pointer增加了指针,删除器以及分配器的存储。 我们先看类内成员
熟悉的老朋友__compressed_pair,在看shared_ptr中的内存申请
weak_ptrweak_ptr和shared_ptr基本一样,weak_ptr在构造时候会将shared_ptr的两个成员变量复制过来,从本质上来说weak_ptr在计数时加到一个和shared_ptr不同的计数上。 成员:
从shared_ptr构造
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:13:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |