”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > C++ 中的智能指针是否会带来大量内存和时间开销?

C++ 中的智能指针是否会带来大量内存和时间开销?

发布于2024-11-13
浏览:721

Do Smart Pointers in C   Come with a Significant Memory and Time Overhead?

C 中智能指针的内存和时间开销

智能指针,如 C 11 中的 std::shared_ptr 和 std::unique_ptr,提供自动内存管理并简化所有权语义。然而,一些开发人员可能想知道与传统指针相比,使用智能指针对性能的潜在影响。

内存开销:

std::unique_ptr 仅在以下情况下才会施加内存开销:提供了一个重要的删除器。然而,std::shared_ptr 总是需要额外的内存用于引用计数器,尽管数量相对较小。

时间开销:

std::unique_ptr 在如果需要复制提供的删除器或需要将指针初始化为 null,则需要进行构造,以及在销毁期间销毁拥有的对象。

std::shared_ptr 主要在构造期间创建引用计数器、在销毁期间经历时间开销递减引用计数器并可能破坏对象,并在赋值期间递增引用计数器。此外,这些增量/减量对于线程安全来说是原子的,进一步增加了开销。

对性能的影响:

重要的是要注意,没有一个智能指针在取消引用期间有时间开销,这通常是指针最频繁的操作。

一般来说,与智能指针相关的开销很小,不会显着影响代码性能。然而,不断创建和销毁智能指针会引入性能瓶颈。

最新教程 更多>
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-18
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-11-18
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-18
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-18
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-18
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-18
  • 如何从针对 Go 二进制文件的集成测试中捕获代码覆盖率?
    如何从针对 Go 二进制文件的集成测试中捕获代码覆盖率?
    从 Go 二进制文件捕获代码覆盖率运行单元测试时,捕获代码覆盖率非常简单。然而,在针对二进制文件本身的集成测试期间收集覆盖率指标可能具有挑战性。有没有办法克服这个障碍?集成测试覆盖率的需要集成测试提供了比单独的单元测试更全面的代码覆盖率视图。通过针对真实世界的输入运行二进制文件,我们可以评估代码在各...
    编程 发布于2024-11-18
  • 如何从终端将数据库导入MySQL?
    如何从终端将数据库导入MySQL?
    从终端导入MySQL数据库使用终端将数据库导入MySQL可以提供一种便捷的数据管理方式。要有效地执行此任务,请按照下列步骤操作:使用命令行,您可以访问 MySQL 提示符。这样做的语法是:mysql -u username -p database_name输入您的用户名、密码和目标数据库名称来代替占...
    编程 发布于2024-11-18
  • 如何使用“index”函数迭代 HTML 模板中的并行数组?
    如何使用“index”函数迭代 HTML 模板中的并行数组?
    如何使用索引迭代 HTML 模板中的并行数组本文解决了迭代并行数组(大小相等)的困难在 HTML 模板中。具体来说,如何利用范围块内的索引函数来实现此目的。索引函数是预定义的全局模板函数,它根据提供的索引从映射、切片或数组中检索项目。该函数允许在模板内的数据结构内进行复杂的导航。在迭代并行数组的上下...
    编程 发布于2024-11-18
  • 迭代 Python 列表时,为什么应该避免删除项目?
    迭代 Python 列表时,为什么应该避免删除项目?
    Python 列表:迭代期间删除项目的陷阱迭代 Python 列表,同时删除项目可能会导致意外行为。一个值得注意的例子如下:letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] for i in letters:...
    编程 发布于2024-11-18
  • 如何消除 CSS 中的双边框:轮廓与负边距?
    如何消除 CSS 中的双边框:轮廓与负边距?
    防止 CSS 中的双边框许多 Web 开发人员在将元素与边框并排设置样式时遇到一个常见问题。由于边框的性质,每个元素都有自己的边框,因此元素相交处可能会出现双边框。这可能不雅观并且会干扰所需的设计。要解决此问题,有两种常见的解决方案:使用轮廓而不是边框​​,或应用负边距。使用轮廓轮廓与边框类似,但仅...
    编程 发布于2024-11-18
  • 如何仅使用 CSS 将图像嵌入 Div 元素内?
    如何仅使用 CSS 将图像嵌入 Div 元素内?
    使用 CSS 将图像集成到 Div 中:有效的解决方案在 Web 开发中,通常需要将图像放置在 div 元素中。虽然使用背景图像是一种常见的方法,但它限制了 div 符合图像大小的能力。这就提出了一个问题:我们如何使用 CSS 创建与 HTML 结构 等效的内容?为了实现这一点,我们利用内容属性将...
    编程 发布于2024-11-18
  • 如何向 JavaScript 函数传递可变数量的参数?
    如何向 JavaScript 函数传递可变数量的参数?
    向 JavaScript 函数传递可变数量的参数JavaScript 在向函数传递参数方面提供了灵活性,包括从数组发送可变数量的参数的能力。通过参数实现变量 Arity与 Python 一样,JavaScript 有一个特殊的参数对象,它表示传递给函数的所有参数。该对象包含每个参数作为可索引属性。例...
    编程 发布于2024-11-18
  • 为什么我无法使用扩展内容脚本将 CSS 注入网页?
    为什么我无法使用扩展内容脚本将 CSS 注入网页?
    扩展内容脚本中的 CSS 注入问题尽管在清单中定义了 CSS 注入,您的 CSS 文件在网页中仍然不存在。以下是可能的原因和解决方案:原因: CSS 规则冲突样式表已注入,但由于其他样式覆盖其规则而未应用。 解决方案:增加CSS特异性: 向您的 CSS 规则添加更具体的选择器。使用 "!i...
    编程 发布于2024-11-18
  • 释放你的 Python 能力:一个对独特字符进行排序的项目
    释放你的 Python 能力:一个对独特字符进行排序的项目
    您准备好踏上迷人的 Python 编程之旅了吗? LabEx.io“项目:删除重复项”课程就是您的最佳选择,您将在其中深入了解数据清理和预处理的世界。这种基于项目的学习体验将使您具备从给定字符串中删除重复字符并按升序输出处理后的字符串的技能 - 对于任何有抱负的 Python 开发人员来说,这都是一...
    编程 发布于2024-11-18

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3