”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 在 C++ 中返回局部变量是否利用命名返回值优化 (NRVO) 来避免复制构造和销毁?

在 C++ 中返回局部变量是否利用命名返回值优化 (NRVO) 来避免复制构造和销毁?

发布于2024-11-11
浏览:384

Does Returning a Local Variable in C   Utilize Named Return Value Optimization (NRVO) to Avoid Copy Construction and Destruction?

返回局部变量是否返回副本并销毁原始变量(NRVO)?

简介:
该问题检查 C 中返回局部变量的行为。具体来说,它探讨了返回的对象是副本还是原始对象,以及它如何影响局部变量的销毁。

返回值优化(NRVO):
With启用NRVO(命名返回值优化)后,编译器会优化返回语句,以避免不必要的复制构造或局部变量的破坏。它通过直接将返回对象构造到目标存储中来实现这一点,消除了中间复制或移动的开销。 NRVO 在满足特定条件时适用,例如具有自动存储期限且与返回类型相同的局部变量。

启用 NRVO 的示例:
考虑以下代码:

class Test {
public:
    Test(int p) { std::cout 

启用 NRVO 后,输出将为:

Constructor called
Destructor called

,在这种情况下,NRVO 优化了 return 语句,将对象 o 直接构造到局部变量 t 的存储中。构造函数被调用一次,并且只为对象 o 调用一个析构函数。

禁用 NRVO 的示例:
但是,可以使用 -fno-elide- 禁用 NRVO构造函数编译器标志。如果没有 NRVO,编译器将显式执行复制构造和销毁步骤。

Constructor called
Constructor called
Destructor called
Destructor called

在这种情况下,构造函数被调用两次(对于局部变量 t 和返回对象 o)。此外,局部变量 t 和返回对象 o 都被单独破坏。

结论:
返回局部变量的行为取决于 NRVO 是否启用或禁用。启用 NRVO 后,局部变量会被优化掉,并且仅针对返回对象调用构造函数和析构函数一次。如果没有 NRVO,复制构造和销毁步骤将显式执行,可能会多次调用构造函数和析构函数。

最新教程 更多>
  • 为什么我的PHP提交按钮没有触发回显和表格显示?
    为什么我的PHP提交按钮没有触发回显和表格显示?
    PHP 提交按钮困境:不可用的回显和表格您的代码打算在单击“提交”按钮时显示回显和表格在 PHP 表单上。但是,您遇到了这些元素仍然隐藏的问题。这是因为您使用 if(isset($_POST['submit'])) 来控制这些元素的显示,但提交按钮缺少 name 属性。解决方案:提供...
    编程 发布于2024-11-15
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-15
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-15
  • 为什么我的 @font-face EOT 字体无法在 Internet Explorer 中通过 HTTPS 加载?
    为什么我的 @font-face EOT 字体无法在 Internet Explorer 中通过 HTTPS 加载?
    @font-face EOT 无法通过 HTTPS 加载:解决方案遇到 @font-face EOT 文件在 Internet 中无法通过 HTTPS 加载的问题在 Explorer 版本 7、8 和 9 中,用户发现无论 HTTPS 上包含的 HTML 页面的托管状态如何,问题仍然存在。经过实验,...
    编程 发布于2024-11-15
  • 为什么通过 Makefile 运行 Go 程序时出现“权限被拒绝”错误?
    为什么通过 Makefile 运行 Go 程序时出现“权限被拒绝”错误?
    权限被拒绝:调查“go run”和 Makefile 调用之间的差异通过 Makefile 运行 Go 程序时遇到权限被拒绝错误可能会令人困惑。此问题源于 GNU make 或其 gnulib 组件中的错误。根本原因在于系统 PATH 中存在一个名为“go”的目录,该目录位于实际 Go 可执行文件所...
    编程 发布于2024-11-15
  • 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-15
  • 可以使用 CSS 设计 SVG 背景图像吗?
    可以使用 CSS 设计 SVG 背景图像吗?
    您可以使用 CSS 设计 SVG 背景图像吗?作为 SVG 爱好者,您精通将 SVG 用作背景图像。然而,仍然存在一个持续存在的问题:您是否也可以在同一个文件中使用 CSS 设计 SVG 样式?遗憾的是,答案是不。用作背景图像的 SVG 被视为与 CSS 样式表隔离的单个实体。 CSS 文件中的样式...
    编程 发布于2024-11-15
  • 能否结合使用 LIKE 和 IN 来实现更强大的 SQL 查询?
    能否结合使用 LIKE 和 IN 来实现更强大的 SQL 查询?
    结合LIKE和IN进行高级SQL查询在SQL中,LIKE运算符经常用于模式匹配,而IN运算符允许我们将一个值与一系列特定值进行匹配。虽然这些运算符有不同的用途,但可以将它们组合起来创建更强大的查询。让我们考虑以下场景:您有一个表,其中有一列名为“company_id”,并且您想要选择其中包含该列的所...
    编程 发布于2024-11-15
  • 为什么PHP中逗号可以用于回显但不能用于返回?
    为什么PHP中逗号可以用于回显但不能用于返回?
    为什么用逗号回显有效,而用逗号返回却不起作用?在 PHP 中使用 echo 和 return 连接值时,有使用句号和逗号之间的细微差别。具体来说:Echo:允许以逗号分隔的多个表达式回显到输出。返回:只能返回一个单个表达式。使用句点句点 (.) 运算符将字符串或其他数据类型连接成单个字符串。例如:e...
    编程 发布于2024-11-15
  • 如何将 Django 数据库从 SQLite 迁移到 MySQL:分步指南
    如何将 Django 数据库从 SQLite 迁移到 MySQL:分步指南
    将 Django DB 从 SQLite 迁移到 MySQL将数据库从 SQLite 迁移到 MySQL 可能是一项艰巨的任务。由于可用的工具和脚本过多,因此很难确定最可靠和最直接的方法。一位经验丰富的 Django 开发人员建议了一个经受时间考验的解决方案。他们建议执行以下步骤:转储现有的 SQL...
    编程 发布于2024-11-15
  • 如何确保 JavaScript 中准确的整数验证:哪种方法最好?
    如何确保 JavaScript 中准确的整数验证:哪种方法最好?
    如何在 JavaScript 中验证整数输入无论是需要检查整数以确保数据一致性,还是需要向用户提示准确的错误消息,JavaScript 提供了多种验证方法整数输入。一种常见的方法是使用 parseInt() 函数。但是,如果您想要处理可能被解析为整数的字符串等场景,仅此方法可能不够。稳健的整数验证函...
    编程 发布于2024-11-15
  • 如何修复 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-15
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-15
  • 如何从现有模型自动生成 Sequelize 迁移?
    如何从现有模型自动生成 Sequelize 迁移?
    使用 Sequelize CLI 自动生成迁移为 Sequelize 模型创建迁移是数据库管理中的关键步骤。迁移使您能够跟踪数据库架构随时间的变化。虽然 Sequelize 提供了用于模型生成的 CLI 工具,但它还提供了从现有模型自动生成迁移的功能。要自动生成迁移,请按照以下步骤操作:安装 Seq...
    编程 发布于2024-11-15
  • 如何计算MySQL中两个日期之间的准确年龄差?
    如何计算MySQL中两个日期之间的准确年龄差?
    在 MySQL 中获取两个日期之间的年龄差在 MySQL 中,计算两个日期之间的年龄差可能具有挑战性,尤其是如果你想要它作为一个整数。通常,使用 DATEDIFF() 或除以 365 会导致浮点值或年份可能不准确。一种有效的方法是使用 TIMESTAMPDIFF() 和适当的日期单位:SELECT ...
    编程 发布于2024-11-15

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

Copyright© 2022 湘ICP备2022001581号-3