unique_ptr需要存储删除器怎么可能没有开销呢?

2024-05-27

先看看C++ Primer讲了什么unique_ptr and shared_ptr:
16.1.6 美元。效率和灵活性

我们可以确定的是shared_ptr不将删除者视为直接成员,因为删除器的类型直到运行时才知道。

因为删除器的类型是a类型的一部分unique_ptr,删除器成员的类型在编译时已知。删除器可以直接存储在每个unique_ptr object.

所以看来shared_ptr没有删除器的直接成员,但是unique_ptr做。然而,另一个问题的得票最高的答案 https://stackoverflow.com/questions/21355037/why-does-unique-ptr-take-two-template-parameters-when-shared-ptr-only-takes-one says:

如果您提供删除器作为模板参数(如unique_ptr)它是类型的一部分,你不需要在该类型的对象中存储任何额外的内容。如果删除器作为构造函数的参数传递(如shared_ptr) 你需要将它存储在对象中。这是额外灵活性的代价,因为您可以对同一类型的对象使用不同的删除器。

引用的两个段落完全矛盾,这让我很困惑。更重要的是,很多人说unique_ptr零开销 https://stackoverflow.com/questions/13460395/how-can-stdunique-ptr-have-no-size-overhead因为它不需要将删除者存储为成员。然而,据我们所知,unique_ptr有一个构造函数unique_ptr<obj,del> p(new obj,fcn),这意味着我们可以向它传递一个删除器,所以unique_ptr似乎已将删除器存储为成员。真是一团糟!


std::unique_ptr<T>很可能是零开销(使用任何合理的标准库实现)。std::unique_ptr<T, D>,对于任意的D,通常不是零开销。

原因很简单:空基优化可用于消除删除器的存储,以防它是空(因此无状态)类型(例如std::default_delete实例化)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unique_ptr需要存储删除器怎么可能没有开销呢? 的相关文章

随机推荐

  • 为什么anchors.centerIn不适用于Column元素?

    我有这段 QML 代码 Column spacing units gu 2 anchors fill parent centerIn parent Row spacing units gu 4 Row spacing units gu 4
  • Twitter api - 搜索太复杂?

    知道为什么 Twitter 会抛出这个错误吗 GET https search twitter com search json q Middle 20Tennessee 20State 20Blue 20Raiders 20Florida
  • Python NameError,变量“未定义”

    它返回的错误是 NameError name lives is not defined 我知道代码并不是尽可能高效 这是我的第一个项目 但是无论我尝试做什么 都会弹出这个错误 我尝试为其创建一个全局变量 但这没有帮助 我真的很感激一些帮助
  • TensorFlow 运算符重载

    有什么区别 tf add x y and x y 在 TensorFlow 中 当您使用以下命令构建图表时 您的计算图表会有什么不同 代替tf add 更一般地说 有 或者其他张量超载的操作 如果至少有一个x or y is a tf Te
  • Google Chrome API:如何添加我的应用程序以在“新标签”(应用程序)页面上显示图标?

    我注意到 新选项卡 页面有一个应用程序部分 但默认情况下不在那里添加应用程序 我需要做什么才能让我的申请出现在那里 托管应用程序和打包应用程序 http code google com chrome webstore docs choosi
  • PostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本

    我正在使用 Npgsql 3 0 3 0 和 PetaPoco 最新版本 当我运行这个命令时 var dateCreated DateTime Now just an example var sql new Sql WHERE date c
  • 匹配字典集。最优雅的解决方案。 Python

    给定两个字典列表 新的和旧的 字典在两个列表中表示相同的对象 我需要找到差异并生成新的字典列表 其中仅包含新字典中的对象和旧字典中的更新属性 例子 list new id 1 name bob desc cool guy id 2 name
  • 复选框选择与 TableView 绑定

    How to bind with TableView selection model with checkbox isSelected in table view In manually using mouse multiple selec
  • 优化 Django Queryset for 循环

    如何优化以下查询集 link goal for link in self child links all 我想摆脱 for 循环并只访问数据库一次 我有以下代码 class Goal models Model name models Cha
  • PhoneGap BarcodeScanner - ClassNotFound

    UPDATE 2 我发布了一个解决我原来问题的答案 看欲了解更多信息 https stackoverflow com a 9541490 398519 UPDATE供任何想知道的人参考 最后我发现了这个 http github com co
  • 在ios键盘上方显示建议工具栏

    我是iOS开发的新手 我正在尝试在 ios 5 1 中创建一个具有 textView 的拼写建议类型应用程序 这样如果用户点击键盘的某个键 则建议工具栏会出现在键盘顶部 其中包含所有建议 并且如果用户点击这些建议之一它将显示在 textVi
  • 如何使子元素被访问/活动时父元素的颜色发生变化

    我有一个下拉导航 我想要做的是 当我单击任何子菜单链接时 我希望父按钮的颜色在链接处于活动状态时保持更改 这是代码的小提琴链接 https jsfiddle net v28ydshL https jsfiddle net v28ydshL
  • Microsoft.Web.Administration 内存泄漏

    拥有一个 Windows 服务 除其他外 还可以监视 IIS 应用程序池 如果任何池已配置应用程序但未运行 则该池 池 将启动 这已经运行良好一段时间了 最近发现该服务存在内存泄漏 查看内存转储 罪魁祸首是用于检查应用程序池的 Micros
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • Xcode 11 向后兼容性:“UIWindowScene 仅在 iOS 13 或更高版本中可用”

    在 Xcode 11 中 我从 Single View App 模板创建了一个新的应用程序项目 我希望这个应用程序能够在 iOS 12 和 iOS 13 中运行 但是当我将部署目标切换到 iOS 12 时 我收到了很多类似这样的错误消息 U
  • Django + 后台任务如何初始化

    我有一个基本的 django 项目 用作 Condor 计算集群的前端接口来生成模拟 用户可以从 django 应用程序开始模拟 在 Condor 中 与仿真相关的元数据和仿真状态保存在数据库中 我需要添加一个新功能 某些 模拟完成时发出通
  • 区分 Mifare Ultralight 和 Mifare Ultralight C

    有没有可靠的方法来确定 RFID 卡是 Mifare Ultralight 还是 Mifare Ultralight C 到目前为止 我发现的唯一方法是利用这两张卡的大小差异 发出超出较小卡边界的读取命令 但它看起来确实像黑客攻击 我认为如
  • shutdown.exe 参数带有破折号或斜杠?

    我使用的电话shutdown exe重新启动安装了不同版本 Windows 的计算机 对于 Windows XP 命令是 shutdown exe r f t 01 对于其他版本的 Windows 我使用 shutdown exe L R
  • 内存泄漏在哪里?

    我使用 InetAddress 来解析 IP 地址 但现在如果 IP 不可用 则需要存储主机名 所以我介绍了一个班级Host case class Host name String ip InetAddress import Host ad
  • unique_ptr需要存储删除器怎么可能没有开销呢?

    先看看C Primer讲了什么unique ptr and shared ptr 16 1 6 美元 效率和灵活性 我们可以确定的是shared ptr不将删除者视为直接成员 因为删除器的类型直到运行时才知道 因为删除器的类型是a类型的一部