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. Jsoup获取全国地区数据(省市县镇村)
  2. 【FPGA】双端口RAM的设计(异步读写)
  3. C++Builder函数集(文件操作、获取时间、类型转换等)
  4. 操作系统第一章作业(2020@usc)
  5. java jdbc url编码_java中jdbc/sql出现编码问题
  6. 第四话 想不到办法,就研究规律 ver1.0
  7. mysql c2_Mysql具有C2级安全性
  8. linq判断集合中相同元素个数_java----Collection集合常用方法
  9. 怎么更改wifi频段_手机wifi延迟高怎么办
  10. 运维人员需重视非技术能力(老鸟经验分享)
  11. 使用读写锁实现同步数据访问
  12. 最实用的自媒体爆文采集工具,简单易出爆文
  13. PPT中的图像如何导出不失真的矢量图
  14. html文字段落i排版,i排版怎么修改字体?i排版字体排版详细介绍
  15. 破网与立网,数字螺旋下的适者生存
  16. 【短道速滑四】Halcon的texture_laws算子自我研究
  17. 用nodejs和vue实现消息盒子
  18. 华退学博士王垠:离开是为了获得力量后再回来
  19. 视频无法播放,视频打不开怎么办?可用这款视频修复工具快速修复
  20. LRC 文件格式定义

热门文章

  1. python 期货交易_Python期货量化交易基础教程(8)
  2. 义教资料均衡验收计算机室解说词,义教均衡迎检现场会导引解说词
  3. 计算机一级b考试理论知识,计算机一级b-一级计算机等级考试中的“一级B”指什么?谢谢! 爱问知识人...
  4. 综合布线的12大热点技术
  5. 数据中心设计的六个关键考虑因素
  6. 小米机器人虚拟墙设置_扫地机器人虚拟墙应该怎么放置使用
  7. docker run -it 如何退出_Docker学习笔记(4)容器的基本命令 1 - 你个小秃头
  8. 成功解决schedule.ScheduleValueError: Invalid time format
  9. Dataset之JFT:JFT/FastEval14k数据集的简介、下载、案例应用之详细攻略
  10. Dataset之图片数据增强:设计自动生成汽车车牌图片算法(cv2+PIL)根据随机指定七个字符生成逼真车牌图片数据集(自然场景下+各种噪声效果)可视化