GNU C++ 智能指针6-- 解析_Sp_counted_inplace类
目录
一、关键点解析
1、__gnu_cxx::__aligned_buffer
2、std::forward
3、remove_cv
4、const_cast
二、源码分析
一、关键点解析
1、__gnu_cxx::__aligned_buffer
__gnu_cxx::__aligned_buffer<_Tp> _M_storage;
__aligned_buffer是为了封装std::aligned_storage并且提供了一些其他便利的工具避免代码重复。并且在C++11有了allocator的支持后, 应该把它用于其他基于节点的容器中。
struct __aligned_buffer : std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>
struct __aligned_buffer 继承std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>而std::aligned_storage的功能就是在不调用构造函数的情况下, 提前分配类型所需要的内存。就像你发的早期代码,创建的时候它会调用到类型的默认构造函数, 这样开销就比较大。
2、std::forward
allocator_traits<_Alloc>::construct(__a, _M_ptr(),
std::forward<_Args>(__args)...); // might throw
std::forward负责原封不动的完美的转发。具体原因请看
(c++11 std::forward使用场景以及作用_kupePoem的专栏-CSDN博客_std::forward作用)
3、remove_cv
remove_cv模板用于获取类型T,去除类型T的const和volatile限定。
4、const_cast
去除指针的const属性
二、源码分析
template<int _Nm, typename _Tp,bool __use_ebo = !__is_final(_Tp) && __is_empty(_Tp)>struct _Sp_ebo_helper;/// Specialization using EBO.template<int _Nm, typename _Tp>struct _Sp_ebo_helper<_Nm, _Tp, true> : private _Tp{explicit _Sp_ebo_helper(const _Tp& __tp) : _Tp(__tp) { }static _Tp&_S_get(_Sp_ebo_helper& __eboh) { return static_cast<_Tp&>(__eboh); }};/// Specialization not using EBO.template<int _Nm, typename _Tp>struct _Sp_ebo_helper<_Nm, _Tp, false>{explicit _Sp_ebo_helper(const _Tp& __tp) : _M_tp(__tp) { }static _Tp&_S_get(_Sp_ebo_helper& __eboh){ return __eboh._M_tp; }private:_Tp _M_tp;};// helpers for make_shared / allocate_sharedstruct _Sp_make_shared_tag { };template<typename _Tp, typename _Alloc, _Lock_policy _Lp>class _Sp_counted_ptr_inplace final : public _Sp_counted_base<_Lp>{class _Impl : _Sp_ebo_helper<0, _Alloc>{typedef _Sp_ebo_helper<0, _Alloc> _A_base;public:explicit _Impl(_Alloc __a) noexcept : _A_base(__a) { }_Alloc& _M_alloc() noexcept { return _A_base::_S_get(*this); }__gnu_cxx::__aligned_buffer<_Tp> _M_storage;};public:template<typename... _Args>_Sp_counted_ptr_inplace(_Alloc __a, _Args&&... __args): _M_impl(__a){// _GLIBCXX_RESOLVE_LIB_DEFECTS// 2070. allocate_shared should use allocator_traits<A>::constructallocator_traits<_Alloc>::construct(__a, _M_ptr(),std::forward<_Args>(__args)...); // might throw}~_Sp_counted_ptr_inplace() noexcept { }virtual void_M_dispose() noexcept{allocator_traits<_Alloc>::destroy(_M_impl._M_alloc(), _M_ptr());}// Override because the allocator needs to know the dynamic typevirtual void_M_destroy() noexcept{typedef typename allocator_traits<_Alloc>::templaterebind_traits<_Sp_counted_ptr_inplace> _Alloc_traits;typename _Alloc_traits::allocator_type __a(_M_impl._M_alloc());_Alloc_traits::destroy(__a, this);_Alloc_traits::deallocate(__a, this, 1);}// Sneaky trick so __shared_ptr can get the managed pointervirtual void*_M_get_deleter(const std::type_info& __ti) noexcept{
#ifdef __GXX_RTTIif (__ti == typeid(_Sp_make_shared_tag))return const_cast<typename remove_cv<_Tp>::type*>(_M_ptr());
#endifreturn nullptr;}private:_Tp* _M_ptr() noexcept { return _M_impl._M_storage._M_ptr(); }_Impl _M_impl;};
GNU C++ 智能指针6-- 解析_Sp_counted_inplace类相关推荐
- GNU C++ 智能指针3-- 解析_Sp_counted_base类
目录 一.关键点解析 1._Lock_policy解析 2.__default_lock_policy的定义 3.__atomic_add_dispatch解析 4.__attribute__ 5._ ...
- 智能指针详细解析(智能指针的使用,原理解析)
本文转自努力的少年博主: https://blog.csdn.net/sjp11/article/details/123899141 目录 一. 智能指针的基本概念 二. 智能指针的定义和使用 三. ...
- 智能指针 shared_ptr 解析
近期正在进行<Effective C++>的第二遍阅读,书里面多个条款涉及到了shared_ptr智能指针,介绍的太分散,学习起来麻烦.写篇blog整理一下. LinJM @HQU s ...
- c语言智能指针是什么,C++ 智能指针深入解析
1. 为什么需要智能指针?简单的说,智能指针是为了实现类似于Java中的垃圾回收机制.Java的垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时 ...
- GNU C++ 智能指针5-- 解析_Sp_counted_deleter类
目录 一.关键点解析 1.头文件 2.ebo 3. _Sp_ebo_helper的定义 4._M_destroy函数解析 二.代码分析 一.关键点解析 1.头文件 shared_ptr_base.h ...
- GNU C++ 智能指针4-- 解析_Sp_counted_ptr类
目录 一.关键点解析 1.final关键字 2.=delete关键字 3.父类 4.noexcept关键字 5.explicit关键字 6.头文件 二.代码分析 一.关键点解析 1.final关键字 ...
- 【c++复习笔记】——智能指针详细解析(智能指针的使用,原理分析)
- 学习笔记:C++进阶【继承、多态、二叉树进阶、map和set、哈希、C++11、异常、智能指针、特殊类设计、C++的类型转换】
文章目录 前言 一.继承 1. 继承的概念及定义 1.1 继承的概念 1.2 继承的定义 1.2.1 定义格式 1.2.2 继承关系和访问限定符 1.2.3 继承基类成员访问方式的变化 2. 基类和派 ...
- 61、智能指针类模板
1.智能指针 智能指针的意义 - 现代C++开发库中最重要的类模板之一 - C++中自动内存管理的主要手段 - 能在很大程度上避开内存相关的问题 STL中的智能指针 auto_ptr(#include ...
最新文章
- JVM调优:常见垃圾回收算法
- lisp 绘制立体感的五角星_几何作图的方法、例子、解答及札记
- [渝粤教育] 中国地质大学 计算机文化基础 复习题
- 江苏省对口单招计算机原理,江苏省对口单招计算机原理教案
- 为什么招聘高级前端开发这么难?
- Wi-Fi 联盟撤销华为资格;华为已熟练掌握 ARM 架构修改;苹果 2020 年或推 5G 手机 | 极客头条...
- 在vue中实现锚点定位功能
- 电信无线服务器的密码是什么,电信光猫wifi默认密码是多少?
- Vulkan----Mac环境搭建
- Windows 8 关闭无线后无法打开WIFI的解决办法
- GD32F103使用串口DMA收+发 信息(无中断)
- Google可能退出中国市场
- 图书查找java_java图书信息查询实例
- 什么是bug(软件缺陷)
- 如何使用百数低代码开发平台制作问卷调查表?
- c++ unrar 源码
- 1736. Latest Time by Replacing Hidden Digits
- mysql数据库试用期过了_mysql试用期过了
- 洛谷 CF7E Defining Macros 题解
- 如何使用CAD编辑器来画箭头