
智能指针源码解析
文章平均质量分 72
轻松进行智能指针学习,剖析智能指针的源码,进入模板元编程和stl源码的世界。
kupeThinkPoem
这个作者很懒,什么都没留下…
展开
-
GNU C++ 智能指针27- 解析__weak_ptr类3
目录一、关键点解析1、std::nothrow2、owner_before3、swap二、源码分析一、关键点解析1、std::nothrow 在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL。异常机制是在后面才发展起来的,异常机制 需要堆栈的支持,这样消耗大量空间,在嵌入式等平台下,使用std:nothrow方式。 标准的new头文件可以定义普通的new,同时,它也可以定义一个变体new操作符,这个操作符叫...原创 2021-10-18 08:40:33 · 321 阅读 · 0 评论 -
GNU C++ 智能指针26- 解析__weak_ptr类2
目录一、关键点解析1、expired()2、expired与lock的线程安全性3、use_count() 和 expired() 函数二、源码分析一、关键点解析1、expired() bool expired() const noexcept { return _M_refcount._M_get_use_count() == 0; }2、expired与lock的线程安全性 (1)expired不是线程安全的...原创 2021-10-17 07:03:25 · 533 阅读 · 0 评论 -
GNU C++ 智能指针25- 解析__weak_ptr类1
一、关键点解析二、源码分析 template<typename _Tp, _Lock_policy _Lp> class __weak_ptr { public: typedef _Tp element_type; constexpr __weak_ptr() noexcept : _M_ptr(0), _M_refcount() { } __weak_ptr(const __weak_ptr原创 2021-10-12 07:02:07 · 223 阅读 · 0 评论 -
GNU C++ 智能指针24- 解析__weak_count类2
目录一、关键点解析1、~__weak_count() noexcept2、 __weak_count<_Lp>& operator=(const __shared_count<_Lp>& __r) noexcept二、源码分析一、关键点解析1、~__weak_count() noexcept template<_Lock_policy _Lp = __default_lock_policy> class...原创 2021-10-08 12:53:25 · 307 阅读 · 0 评论 -
GNU C++ 智能指针23- 解析__weak_count类1
目录一、关键点解析1、_Sp_counted_base<_Lp>* _M_pi;2、__weak_count(const __shared_count<_Lp>& __r) noexcept3、__weak_count(const __weak_count<_Lp>& __r) noexcept二、源码分析一、关键点解析1、_Sp_counted_base<_Lp>* _M_pi; __sh...原创 2021-10-08 11:18:40 · 428 阅读 · 0 评论 -
GNU C++ 智能指针22- 解析shared_ptr类
目录一、关键点解析1、operator=2、operator==3、其它二、源码分析三、总结一、关键点解析1、operator= shared_ptr& operator=(shared_ptr&& __r) noexcept { this->__shared_ptr<_Tp>::operator=(std::move(__r)); return *this; }...原创 2021-10-07 06:24:55 · 545 阅读 · 0 评论 -
std::less源码剖析
目录一、关键点解析1、noexcept(1) 关键字noexcept(2)有条件的noexcept(3)noexcept使用建议2、__cplusplus > 201103L3、less4、typedef __is_transparent is_transparent5、右值引用例子二、源码分析一、关键点解析1、noexcept(1) 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept。比如...原创 2021-10-01 22:50:18 · 862 阅读 · 0 评论 -
GNU C++ 智能指针21- 解析__shared_ptr类9
目录一、关键点解析1、 template inline bool operator==(const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept { return !__a; }2、std::less<_Tp*>()(__a.get(), nullptr)What does the International Standard (N3337) say?So, what is the s...原创 2021-09-27 18:20:23 · 374 阅读 · 0 评论 -
GNU C++ 智能指针20- 解析__shared_ptr类8
目录一、关键点解析1、constexpr(1)概念(2)constexpr函数(3)constexpr构造函数 (4)性能测试二、源码分析三、参考一、关键点解析1、constexpr(1)概念 在 C 里面,const 很明确只有「只读」一个语义,不会混淆。C++ 在此基础上增加了「常量」语义,也由 const 关键字来承担。C++11 把「常量」语义拆出来,交给新引入的 constexpr 关键字。 简单说const其实是r...原创 2021-09-19 07:05:39 · 662 阅读 · 0 评论 -
GNU C++ 智能指针19- 解析__shared_ptr类7
目录一、关键点解析1、拷贝构造函数和赋值函数2、=default二、源码分析一、关键点解析1、拷贝构造函数和赋值函数class A{ public: A(); //普通构造函数 A(const A& a); //拷贝构造函数 A& operate=(const A& a); //赋值函数}void Func(A a){ }A a; //调用普通构造函数A b(a); //b不存在,会调用了拷贝构造函数A b=a; //b不存在,原创 2021-09-18 07:18:09 · 334 阅读 · 0 评论 -
std::common_type源码剖析
template<typename _Tp> struct __success_type { typedef _Tp type; }; struct __failure_type { }; /// common_type template<typename... _Tp> struct common_type; // Sfinae-friendly common_type implementation: struct __d...原创 2021-09-15 07:37:37 · 772 阅读 · 1 评论 -
decltype分析和std::declval源码剖析
目录一、概述二、decltype1、简介2、例子3、总结三、declval1、简介2、源码分析3、例子一、概述 decltype是c++11以后出现的一个新的关键字,是用来萃取表达式或者变量或者函数返回值的类型的。 declval是c++11中的一个模板函数,原型如下: template<class T> typename std::add_rvalue_reference<T>::t...原创 2021-09-13 16:19:43 · 596 阅读 · 0 评论 -
std::make_shared源码剖析
目录一、概述二、优点1、提高性能2、异常安全三、缺点1、如果构造函数是保护或私有时,无法使用 make_shared2、可能无法及时释放对象的内存四、源码分析五、参考一、概述 C++11 中引入了智能指针, 同时还有一个模板函数std::make_shared可以返回一个指定类型的std::shared_ptr。shared_ptr<string> p1 = make_shared<string>(10, '9'...原创 2021-09-11 10:44:46 · 2181 阅读 · 0 评论 -
GNU C++ 智能指针18- 解析__shared_ptr类6
目录一、关键点解析1、less2、explicit3、__shared_ptr的右值构造函数4、owner_before5、 __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, _Tp* __p) noexcept二、源码剖析一、关键点解析1、less template<typename _Sp> struct _Sp_less : public binary_functio.原创 2021-09-11 09:25:40 · 250 阅读 · 0 评论 -
GNU C++ 智能指针17- 解析__shared_ptr类5
目录一、关键点解析1、__GXX_RTTI2、typeid3、_Sp_make_shared_tag4、 typedef typename _Alloc::template rebind<_Tp>::other _Alloc2;5、_Deleter<_Alloc2> __del = { _Alloc2(__a) };6、common_type二、源码分析一、关键点解析1、__GXX_RTTI This ma...原创 2021-09-05 21:40:52 · 490 阅读 · 0 评论 -
GNU C++ 智能指针16- 解析__shared_ptr类4
目录一、关键点解析1、_S_raw_ptr2、__addressof4、static_pointer_cast、const_pointer_cast和dynamic_pointer_cast5、与bool类型的转换6、与nullptr_t的比较二、源码分析一、关键点解析1、_S_raw_ptr template<typename _Tp1> static _Tp1* _S_raw_ptr(_Tp1* __ptr) { return __p原创 2021-09-04 23:14:32 · 286 阅读 · 0 评论 -
GNU C++ 智能指针15- 解析__shared_ptr类3
目录一、关键点解析1、_M_swap2、enable_if3、typename = typename4、_M_get_deleter二、源码分析一、关键点解析1、_M_swap 调用__shared_count类中的_M_swap(https://blog.youkuaiyun.com/kupepoem/article/details/119944304) void _M_swap(__shared_count& __r) noexcept//...原创 2021-09-01 10:00:27 · 301 阅读 · 0 评论 -
GNU C++ 智能指针14- 解析__shared_ptr类2
目录一、关键点解析1、__enable_shared_from_this_helper二、源码分析一、关键点解析1、__enable_shared_from_this_helper // Support for enable_shared_from_this. // Friend of __enable_shared_from_this. template<_Lock_policy _Lp, typename _Tp1, typename _Tp2>原创 2021-08-31 16:46:56 · 317 阅读 · 0 评论 -
__enable_shared_from_this源码剖析
目录一、关键点解析1、mutable2、为什么要用 enable_shared_from_this?二、源码剖析三、使用例子一、关键点解析1、mutable mutable __weak_ptr<_Tp, _Lp> _M_weak_this 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。friend void __ena...原创 2021-08-31 16:11:37 · 412 阅读 · 0 评论 -
GNU C++ 智能指针13- 解析__shared_ptr类1
目录一、关键点解析1、_ConvertibleConcept2、__glibcxx_function_requires3、is_void二、源码分析一、关键点解析1、_ConvertibleConcept template <class _From, class _To> struct _ConvertibleConcept { void __constraints() { _To __y _IsUnused = __x; ...原创 2021-08-31 08:44:58 · 287 阅读 · 0 评论 -
GNU C++ 智能指针12- 解析__shared_count类3
目录一、关键点解析1、typename... _Args2、is_reference<_Del>::value3、remove_reference4、reference_wrapper二、源码分析一、关键点解析1、typename... _Argstypename... _Args template<typename _Tp, typename _Alloc, typename... _Args> __shared_cou...原创 2021-08-30 10:32:52 · 391 阅读 · 0 评论 -
GNU C++ 智能指针11-- 解析__shared_count类2
目录一、关键点解析1、_Alloc_traits::allocate2、_Alloc_traits::construct3、_M_pi;二、源码分析一、关键点解析1、_Alloc_traits::allocate_Alloc_traits::allocate(__a2, 1); template<typename _Alloc2> using __has_allocate = typename __allocate_helper<...原创 2021-08-30 07:22:48 · 564 阅读 · 0 评论 -
std::forward和std::move源码分析
一、forward源码 /** * @brief Forward an lvalue. * @return The parameter cast to the specified type. * * This function is used to implement "perfect forwarding". */ template<typename _Tp> constexpr _Tp&& forward(typ原创 2021-08-29 06:48:56 · 918 阅读 · 0 评论 -
一文读懂C++右值引用和std::move
C++11引入了右值引用,有一定的理解成本,工作中发现不少同事对右值引用理解不深,认为右值引用性能更高等等。本文从实用角度出发,用尽量通俗易懂的语言讲清左右值引用的原理,性能分析及其应用场景,帮助大家在日常编程中用好右值引用和std::move。1. 什么是左值、右值首先不考虑引用以减少干扰,可以从2个角度判断:左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。int a = 5;a可以通过 & 取地址,位于等号左边,所以a是左值。 5位于等号右边,5没法通过 &a转载 2021-08-28 06:26:18 · 291 阅读 · 0 评论 -
c++引用折叠
目录一、引用折叠二、示例解析三、参考:一、引用折叠 由于存在T&&这种万能引用类型,当它作为参数时,有可能被一个左值引用或右值引用的参数初始化,这是经过类型推导的T&&类型,相比右值引用(&&)会发生类型的变化,这种变化就称为引用折叠。1.所有右值引用折叠到右值引用上仍然是一个右值引用。(A&& && 变成 A&&)2.所有的其他引用类型之间的折叠都将变成左值引用。 (A...原创 2021-08-27 09:03:49 · 8660 阅读 · 0 评论 -
GNU C++ 智能指针10-- 解析__shared_count类1
一、关键点解析1、conditional // Primary template. /// Define a member typedef @c type to one of two argument types. template<bool _Cond, typename _Iftrue, typename _Iffalse> struct conditional { typedef _Iftrue type; }; // Partial specia原创 2021-08-27 07:31:28 · 370 阅读 · 0 评论 -
GNU C++ 智能指针9-- 解析allocator类
目录一、关键点解析1、propagate_on_container_move_assignment二、源码分析一、关键点解析1、propagate_on_container_move_assignment This type isAlloc::propagate_on_container_move_assignment, if that type is well-formed; otherwise, this type isfalse_type. If the typ...原创 2021-08-26 13:30:33 · 343 阅读 · 0 评论 -
GNU C++ 智能指针8-- 解析__allocator_base类2
一、关键点解析1、ptrdiff_t#ifndef _PTRDIFF_T_DEFINED#define _PTRDIFF_T_DEFINED#ifndef _PTRDIFF_T_#define _PTRDIFF_T_#undef ptrdiff_t#ifdef _WIN64__MINGW_EXTENSION typedef __int64 ptrdiff_t;#elsetypedef int ptrdiff_t;#endif /* _WIN64 */#endif /* _PTR原创 2021-08-26 09:41:07 · 894 阅读 · 0 评论 -
GNU C++ 智能指针7-- 解析__allocator_base类1
目录一、关键点解析1、__cplusplus2、c++allocator.h文件内容分析3、_GLIBCXX_VISIBILITY4、_GLIBCXX_BEGIN_NAMESPACE_VERSION二、源码分析一、关键点解析1、__cplusplus这是一个c++预定义宏c++ 98中,是199711Lc++ 11中,是201103L2、c++allocator.h文件内容分析#if __cplusplus >= 201103Lnamespac原创 2021-08-26 07:28:32 · 655 阅读 · 0 评论 -
GNU C++ 智能指针6-- 解析_Sp_counted_inplace类
一、关键点解析1、__gnu_cxx::__aligned_buffer __gnu_cxx::__aligned_buffer<_Tp> _M_storage; __aligned_buffer是为了封装std::aligned_storage并且提供了一些其他便利的工具避免代码重复。并且在C++11有了allocator的支持后, 应该把它用于其他基于节点的容器中。 struct __aligned_buffer: std:...原创 2021-08-25 09:19:13 · 947 阅读 · 0 评论 -
c++11 std::forward使用场景以及作用
不使用std::forward时,下述代码G不管传入什么类型的参数,只会最终调用void F(int& a);using namespace std;void F(int& a) { cout << "int& version " <<a <<endl;}void F(int&& a) { // do something cout << "int&& vers...转载 2021-08-25 09:18:15 · 1411 阅读 · 0 评论 -
GNU C++ 智能指针5-- 解析_Sp_counted_deleter类
目录一、关键点解析1、头文件2、ebo3、 _Sp_ebo_helper的定义4、_M_destroy函数解析二、代码分析一、关键点解析1、头文件shared_ptr_base.h2、ebo EBO(empty base optimization)(具体请看https://blog.youkuaiyun.com/kupepoem/article/details/119862084)3、 _Sp_ebo_helper的定义 template...原创 2021-08-23 09:24:05 · 336 阅读 · 0 评论 -
C++ EBO 空基类最优化
EBO全称empty base optimization最近看EffectiveC++ 条款39,这个名词让我很陌生,学过之后发现也不是什么新鲜玩意了。1.什么是EBOempty base optimization,空基类最优化,说到什么是EBO,要先从一道面试题说起:class A{};cout <<sizeof(A)<<endl;sizeof这样一个空类,结果是1,原因是编译器会给这个空类默默的安插一个char,用来标识这个类。如下情况,考虑到字节对..转载 2021-08-23 09:14:51 · 435 阅读 · 0 评论 -
GNU C++ 智能指针4-- 解析_Sp_counted_ptr类
目录一、关键点解析1、final关键字2、=delete关键字3、父类4、noexcept关键字5、explicit关键字二、代码分析一、关键点解析1、final关键字(1)、类禁止继承 C++11中允许将类标记为final,方法时直接在类名称后面使用关键字final,如此,意味着继承该类会导致编译错误。(2)、虚函数禁止重写 C++中还允许将虚函数方法标记为fianal,这意味着无法再子类中重写该方法。2、=delete关键...原创 2021-08-23 06:22:23 · 574 阅读 · 0 评论 -
锁、内存屏障与缓存一致性
在应用层,关于锁的使用大家应该都很熟悉了,作用就是为了保护共享变量不被同时操作而导致无法预测的情况。然而深入到具体实现,锁仅仅只是锁定临界区吗?锁的实现其实还必须实现一个语义,也就是内存屏障。内存屏障主要用于防止指令重排而导致的无法预测的情况。代码经过编译器生成的指令并不一定都是按着我们原先的想法来生成的,可能经过优化等情况进行了指令的重排,然而这些重排在执行后的结果应当是一致的。其实及时编译器不重排指令,在现代的cpu中,也常常会将指令乱序执行,所以内存屏障可以保证屏障指令前后的指令顺序。内存屏障转载 2021-08-22 10:59:43 · 417 阅读 · 0 评论 -
内存屏障的理解
内存屏障缘由1. 单处理器下的乱序问题2. 多处理器下的内存同步问题举例:在如图的这种系统模型中,假设存在如下的内存访问操作:由于处理器出于效率而引入的乱序执行(out-of-order execution)和缓存的关系,对于内存来说, 最后x和y的值可以有如下组合:因此,对于在操作系统这一层次编程的程序员来说,他们需要一个内存模型,以协调处理器间正确地使用共享内存,这个模型叫做内存一致性模型(memory consistency model)或...转载 2021-08-22 10:40:02 · 272 阅读 · 0 评论 -
GNU C++ 智能指针3-- 解析_Sp_counted_base类
目录一、关键点解析1、_Lock_policy解析2、__default_lock_policy的定义3、__atomic_add_dispatch解析4、__attribute__5、__exchange_and_add_dispatch解析6、_GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE和_GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER解析7、_GLIBCXX_READ_MEM_BARRIER和_GLI..原创 2021-08-22 10:08:13 · 1872 阅读 · 1 评论 -
GNU C++ 智能指针1-- 解析__mutex 类
目录一、关键问题解析1、__GTHREAD_MUTEX_INIT的解析2、__gthread_active_p的解析3、__gthread_mutex_t二、代码解析一、关键问题解析1、__GTHREAD_MUTEX_INIT的解析gthr-default.h文件中定义#define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZERPTHREAD_MUTEX_INITIALIZER则是一个结构常量2、__gth.原创 2021-08-21 18:30:44 · 828 阅读 · 0 评论 -
GNU C++ 智能指针2-- 解析_Mutex_base类
目录一、关键点解析1、_S_mutex解析2、_Mutex_base的父类二、代码解析一、关键点解析1、_S_mutex解析 enum _Lock_policy { _S_single, _S_mutex, _S_atomic };可以看出_S_mutex是个enum值,值为12、_Mutex_base的父类是继承__mutex 类的(__mutex 类解析可以参考https://blog.youkuaiyun.com/kupepoem/article/details/1..原创 2021-08-22 06:52:48 · 375 阅读 · 0 评论