目录

一、关键点解析

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类相关推荐

  1. GNU C++ 智能指针3-- 解析_Sp_counted_base类

    目录 一.关键点解析 1._Lock_policy解析 2.__default_lock_policy的定义 3.__atomic_add_dispatch解析 4.__attribute__ 5._ ...

  2. 智能指针详细解析(智能指针的使用,原理解析)

    本文转自努力的少年博主: https://blog.csdn.net/sjp11/article/details/123899141 目录 一. 智能指针的基本概念 二.  智能指针的定义和使用 三. ...

  3. 智能指针 shared_ptr 解析

    近期正在进行<Effective C++>的第二遍阅读,书里面多个条款涉及到了shared_ptr智能指针,介绍的太分散,学习起来麻烦.写篇blog整理一下. LinJM   @HQU s ...

  4. c语言智能指针是什么,C++ 智能指针深入解析

    1. 为什么需要智能指针?简单的说,智能指针是为了实现类似于Java中的垃圾回收机制.Java的垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时 ...

  5. GNU C++ 智能指针5-- 解析_Sp_counted_deleter类

    目录 一.关键点解析 1.头文件 2.ebo 3. _Sp_ebo_helper的定义 4._M_destroy函数解析 二.代码分析 一.关键点解析 1.头文件 shared_ptr_base.h ...

  6. GNU C++ 智能指针4-- 解析_Sp_counted_ptr类

    目录 一.关键点解析 1.final关键字 2.=delete关键字 3.父类 4.noexcept关键字 5.explicit关键字 6.头文件 二.代码分析 一.关键点解析 1.final关键字 ...

  7. 【c++复习笔记】——智能指针详细解析(智能指针的使用,原理分析)

  8. 学习笔记:C++进阶【继承、多态、二叉树进阶、map和set、哈希、C++11、异常、智能指针、特殊类设计、C++的类型转换】

    文章目录 前言 一.继承 1. 继承的概念及定义 1.1 继承的概念 1.2 继承的定义 1.2.1 定义格式 1.2.2 继承关系和访问限定符 1.2.3 继承基类成员访问方式的变化 2. 基类和派 ...

  9. 61、智能指针类模板

    1.智能指针 智能指针的意义 - 现代C++开发库中最重要的类模板之一 - C++中自动内存管理的主要手段 - 能在很大程度上避开内存相关的问题 STL中的智能指针 auto_ptr(#include ...

最新文章

  1. JVM调优:常见垃圾回收算法
  2. lisp 绘制立体感的五角星_几何作图的方法、例子、解答及札记
  3. [渝粤教育] 中国地质大学 计算机文化基础 复习题
  4. 江苏省对口单招计算机原理,江苏省对口单招计算机原理教案
  5. 为什么招聘高级前端开发这么难?
  6. Wi-Fi 联盟撤销华为资格;华为已熟练掌握 ARM 架构修改;苹果 2020 年或推 5G 手机 | 极客头条...
  7. 在vue中实现锚点定位功能
  8. 电信无线服务器的密码是什么,电信光猫wifi默认密码是多少?
  9. Vulkan----Mac环境搭建
  10. Windows 8 关闭无线后无法打开WIFI的解决办法
  11. GD32F103使用串口DMA收+发 信息(无中断)
  12. Google可能退出中国市场
  13. 图书查找java_java图书信息查询实例
  14. 什么是bug(软件缺陷)
  15. 如何使用百数低代码开发平台制作问卷调查表?
  16. c++ unrar 源码
  17. 1736. Latest Time by Replacing Hidden Digits
  18. mysql数据库试用期过了_mysql试用期过了
  19. 洛谷 CF7E Defining Macros 题解
  20. 如何使用CAD编辑器来画箭头

热门文章

  1. 收益率的分解 无风险利率
  2. python-scrapy爬虫框架爬取王者荣耀英雄皮肤图片和技能信息
  3. Valley Blue Pasture《谷蓝尼牧场》签到可领大红包
  4. 2022年终总结:少年不惧岁月长,彼方尚有荣光在。
  5. 清华大学计算机科学与技术系朱军教授:机器学习里的贝叶斯基本理论、模型和算法
  6. 深度学习端到端的优缺点和网络泛化性
  7. 案例分享 | 戴尔 VxRail 研发团队: 效能度量如何支持成长期团队的超线性增长
  8. 【JavaScript】17 - DOM
  9. 最适合跑步用的耳机有哪些、精选五款最优秀的跑步耳机推荐
  10. ThinkPHP6.0 Session 问题