1. 标准库智能指针类型 shared_ptr 和 unique_ptr

shared_ptr unique_ptr
管理所保存的指针的策略 共享指针所有权 独占指针
用户重载默认删除器的方式 在运行时绑定删除器,使用户重载删除器更为方便 编译时绑定删除器,避免了间接调用删除器的运行时开销

1.2 shared_ptr 重载删除器

  • 在创建或 reset 指针时传递给它一个可调用对象。
  • 在一个 shared_ptr 的生存期中, 我们可以随时改变其删除器的类型。

1.2.1 类成员的类型在运行时是不能改变的。因此,不能直接保存删除器。

假定 shared_ptr 将它管理的指针保存在一个成员 p 中, 且删除器是通过一个名为 del 的成员来访问的。 则 shared_ptr 的析构函数必须包含类似下面这样的语句:

// del 的值只有在运行时才知道; 通过一个指针来调用它
del ? del (p ) : delete p; // del (p> 需要运行时跳转到 del 的地址

由于删除器是间接保存的,调用 del § 需要一次运行时的跳转操作, 转到 del 中保存的地址来执行对应的代码。

1.3 unique_ ptr删除器

删除器的类型是一个unique_ ptr对象的类型的一部分。删除器成员的类型在编译时是知道的, 从而删除器可以直接保存在 unique_ptr 对象中

用户必须在定义unique_ ptr时以显式模板实参的形式提供删除器的类型,有两个模板参数:

  • 管理的指针
  • 删除器的类型

unique_ ptr的析构函数与shared_ ptr 的析构函数类似,也是对其保存的指针调用用户提供的删除器或执行delete:

//del在编译时绑定;直接调用实例化的删除器
del(p); //无运行时额外开销

del的类型或者是默认删除器类型,或者是用户提供的类型。到底是哪种情况没有关系,应该执行的代码在编译时肯定会知道。实际上,如果删除器是类似DebugDelete (参见16.1.4节,第595页)之类的东西,这个调用甚至可能被编译为内联形式。

C++ Primer 5th笔记(chap 16 模板和泛型编程)效率与灵活性相关推荐

  1. C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move

    1. 标准库定义 / / 在返回类型和类型转换中也要用到 typename, 参见 16.1.3 节( 第 593 页 ) reference 是在 16.2.3 节( 第 605 页 ) 中介绍的 ...

  2. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板部分特例化

    1. 类模板的部分特例化(partial specialization) 类模板的特例化不必为所有模板参数提供实参(可以只指定一部分而非所有模板参数, 或是参数的一部分而非全部特性).类模板的部分特例 ...

  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化

    1. 定义一个特例化版本, 模板参数为 Sales data // 打开std 命名空间, 以便特例化 std::hash namespace std {template struct hash< ...

  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化

    1. 场景 //第一个版本:可以比较任意两个类型 template <typename T> int compare (const T &, const T & );//第 ...

  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)转发参数包

    1. 使用可变参数模板与 forward 机制来编写函数, 实现将其实参不变地传递给其他函数(保持实参的原始类型) 1.1 eg class StrVec {public:template <c ...

  6. C++ Primer 5th笔记(chap 16 模板和泛型编程)包扩展

    1. 扩展 ( expand) 扩展一个包就是将它分解为构成的元素, 对每个元素应用模式, 获得扩展后的列表. 通过在模式右边放一个省略号(-)来触发扩展操作.当扩展一个包时,我们还要提供用于每个扩展 ...

  7. C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板

    1. 可变参数模板( variadic template) 一个接受可变数目参数的模板函数或模板类. 1.1 参数包 (parameter packet) 可变数目的参数被称为参数包,存在两种参数包: ...

  8. C++ Primer 5th笔记(chap 16 模板和泛型编程)重载模板和类型转换

    1. C 风格字符串指针和字符串字面常量 cout « debug_rep ("hi world!" ) << endl; / / 调用 debug_rep (T* ) ...

  9. C++ Primer 5th笔记(chap 16 模板和泛型编程)重载与模板

    1. 定义 函数模板可以被另一个模板或一个普通非模板函数重载: 名字相同的函数必须具有不同数量或类型的参数 1.1 函数模板匹配因素 对于一个调用, 其候选函数包括所有模板实参推断成功的函数模板实例. ...

最新文章

  1. 漫话:如何给女朋友解释为什么Windows上面的软件都想把自己安装在C盘
  2. 大连海事大学计算机系王兴元,王兴元,
  3. 从C语言的角度重构数据结构系列(八)-数据结构堆知识超级丑数
  4. java有password_hash吗,java 实现 PHP password_hash() password_verify() 单向验证
  5. js json过滤_如何在浏览器不崩溃的情况下过滤 200 万行数据?
  6. Linux Disk Quota实践
  7. DIY(也即Build Your Own) vSAN时,选择SSD需要注意的事项
  8. ASP.NET Core 3.0 实战:构建多版本 API 接口
  9. 数电渣渣的一点学习感想(更新中)
  10. C++指针编程你要小心的陷阱——如何优雅的释放指针void*
  11. 使用XLSTransformer生成报表的步骤和流程
  12. 域名申请、解析和备案
  13. 【软件设计】BDD由内而外采用策略
  14. 电脑无法获取服务器信息,电脑无法获取IP地址怎么办?原来只需四招就搞定
  15. K路归并排序与败者树
  16. Windows内存清理篇——小结
  17. 计算机专业可以考天文学研究生吗,报考南京大学天文系有什么要求?
  18. python 时间序列预测——NARX循环神经网络
  19. 浅谈Asterisk的语音编码(codec)
  20. php源码 炸鸡网络验证系统源码/功能强大

热门文章

  1. IO多路复用:select/poll/epoll
  2. oracle命令格式,OraCmD(Oracle命令行工具) V3.1 官方版
  3. cmd写java程序_用cmd写一个最简单的Java程序
  4. tag+标签+php,ZBLOG PHP代码实现侧栏彩色标签TAG关键字样式方法
  5. 移动端布局三种视口_移动端适配之视口和meta标签
  6. 从本地的win传文件到本地的linux上,pscp.exe实现本地windows下的文件下载(传输)到linux上...
  7. 数据中心管理:从DCIM过渡到DMAAS
  8. 成功解决未授予用户在此计算机上的请求登录类型图文教程
  9. TF之CNN:CNN实现mnist数据集预测 96%采用placeholder用法+2层C及其max_pool法+隐藏层dropout法+输出层softmax法+目标函数cross_entropy法+
  10. 对官网vue事件修饰符串联的顺序如何理解?