函数使用 NRV 优化应遵循哪些规则

2024-02-26

我应该遵循哪些规则或技巧才能使函数能够在函数中使用 NRV(命名返回值)优化?我从不同的地方吸收了这些提示,但不知道我的理解是否正确:

  1. 要返回的对象在函数内部不应该有任何名称(那为什么叫NAMED返回值优化!!)
  2. return 语句应该将对象用括号括起来
  3. 要返回的对象应该具有显式和内联的复制构造函数

如果您指的是 NRVO(命名返回值优化)而不是 RVO(返回值优化),那么该对象必须在函数内部命名。否则,它只能获得 RVO,而不能获得 NRVO。所以有一个很好的理由来称呼它Named返回值优化。

查看以下示例:

RVO:

BigObject foo(int x, int y)
{
    // Returned BigObject is created ad-hoc, and has no local 'name'.
    return BigObject(x, y);
}

void bar()
{
    BigObject obj = foo(4, 6);
}

将由优化编译器翻译为以下伪代码:

void foo(int x, int y, BigObject& ret)
{
    ret._constructor_(x, y);
}

void bar()
{
    BigObject obj; // Allocate obj on the stack, but don't construct it just yet!
    foo(4, 6, obj); // Now obj is constructed by foo()
}

NRVO:

BigObject foo(int x, int y, int z)
{
    // Returned BigObject has a local 'name' in foo(), which is obj.
    BigObject obj(x, y);

    // Do something with obj
    obj.setZ(z);

    return obj;
}

void bar()
{
    BigObject obj = foo(4, 6, 7);
}

将由优化编译器翻译为以下伪代码:

void foo(int x, int y, int z, BigObject& ret)
{
    ret._constructor_(x, y);

    // Do something with ret
    ret.setZ(z);
}

void bar()
{
    BigObject obj; // Allocate obj on the stack, but don't construct it just yet!
    foo(4, 6, 7, obj); // Now obj is constructed by foo()
}

请注意,优化是否实际发生很大程度上取决于编译器。某些编译器(例如非常旧的编译器)根本不会执行 RVO 或 NRVO,而其他编译器可能对此优化有不同的限制。以下是 MSVC 对 NRVO 施加的约束的描述:http://msdn.microsoft.com/en-us/library/ms364057(v=vs.80).aspx#nrvo_cpp05_topic3 http://msdn.microsoft.com/en-us/library/ms364057(v=vs.80).aspx#nrvo_cpp05_topic3

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

函数使用 NRV 优化应遵循哪些规则 的相关文章

  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum

随机推荐

  • 在尝试 Android 编程之前我应该​​学多少 Java? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我一直在寻找Android的初学者学习书籍 当然发现我应该先学习Java 所以我开始学习 Java 现在我对对象 类 继承 接口非常熟悉 并且刚
  • 通过 C# Graphics 绘制“透明”文本,但在某种程度上它将绘制的文本变为“缺失”,因此它在结果图像中是透明的

    我希望在 DC 上绘制一个字符串 图形 我正在使用 C 但我希望将绘制的文本从图像中 删除 以便剩下的本质上是文本的剪切 如果我用透明画笔绘制绳索 显然什么都不会发生 有没有一种方法可以绘制类似的东西 或者我是否需要使用 2 个 DC 和
  • Pyopengl 镶嵌多边形

    我有以下形式的多边形 1 2 2 4 3 4 5 6 我需要镶嵌来绘制它们 但是 glutes 太复杂了 Opengl 无法处理凸多边形 我想我需要类似的东西 http www math uiuc edu gfrancis illimath
  • 如何为单个文件启用 ARC

    我想将使用 ARC 编写的单个 Objective C 类引入旧项目中 互联网提供了许多关于如何为项目启用 ARC 然后为单个文件禁用它的参考 但我想做相反的事情 我想保持项目原样 即使用手动引用计数 然后仅为新文件启用 ARC 我的搜索在
  • 为什么 Gitlab-CI 在下一阶段删除工件?

    指定依赖关系后 Gitlab CI当进入下一阶段时 仍然会从工作目录中删除工件 我已经尝试了该代码的所有不同变体 我认为这些变体应该有效 但没有成功 此外 我已经阅读了几个小时但尚未成功 亚搏体育实验室11 6 0 stages build
  • mef 中的组合容器所持有的类的实例

    据我了解 MEF CompositionContainer 创建并保留类的实例 我不知道在什么情况下 CompositionContainer 的内部会有一个类实例 任何人都可以列出对 CompositionContainer 执行的操作或
  • C++ 相当于代数数据类型?

    假设我有这个 Haskell 代码 data RigidBody RigidBody Vector3 Vector3 Float Shape position velocity mass and shape data Shape Ball
  • WEKA 工具包中的隐马尔可夫模型相当于什么?

    我需要对来自由 8 个加速度计组成的传感器网络的数据流进行分类 每个加速度计都会给我一个 X Y 和 Z 值 因此 在每个样本中 我有 8 x 3 24 个加速度值 我的采样频率约为 30 Hz 执行时间约为 0 5 秒 起初我想为此使用隐
  • 如何使用反射改变属性值

    是否可以使用反射来更改类的属性值 以下是我的课程 public class LoggerManager private static LoggerManager instance new LoggerManager private Logg
  • 使用 awk getline bash 从指定时间范围内的日志文件中提取数据

    我正在搜索解析日志文件并在此链接中找到了我需要的内容从日志文件中提取指定时间范围内的数据 https stackoverflow com questions 7575267 extract data from log file in spe
  • SemanticException 分区规范 {col=null} 包含非分区列

    我正在尝试使用以下代码在配置单元中创建动态分区 SET hive exec dynamic partition true SET hive exec dynamic partition mode nonstrict create exter
  • PHP 数组按值和日期排序(2 列)[重复]

    这个问题在这里已经有答案了 我在 PHP 中有多维数组 就像是 mylist array array ID gt 1 title gt Hello datetime gt 2014 05 05 12 08 PM array ID gt 2
  • 在 travis-ci 上使用秘密 api 密钥

    我想用特拉维斯 ci http travis ci org 对于我的一个projects https github com adelevie parse ruby client 该项目是一个 API 包装器 因此许多测试都依赖于 API 密
  • Fortran 多态性、函数和分配

    我是 Fortran OOP 的初学者 我正在尝试编写一个程序 其中包含处理多态变量作为参数的过程 尽管我的原始代码要复杂得多 许多过程 几个派生类型等 但我可以隔离我的问题的一个简单示例 例如 我有一个复制多态变量并稍微修改此副本的过程
  • 如何配置 Spring MVC 来防止“基于路径的漏洞”

    我有一个 Spring MVC 5 0 8 RELEASE 应用程序 最近的安全扫描表明它具有 基于路径的漏洞 这是控制器 RequestMapping value faq method RequestMethod GET public S
  • 编写一个可调用 C 代码的 void 过程?

    编写一个可从 C 调用的汇编过程 称为increment 该过程应采用指向 32 位整数的指针作为参数 并应递增该参数指向的整数 该函数的 C 原型如下 void increment int p 仅提供从过程标签到 ret 指令的汇编代码
  • Xcode 中的 Swift 编译时间极长

    我有三个 iOS 项目 第一个 35k Swift LOC Swift 2 1 或 2 0 使用 Xcode 7 2 3 编译 第二个 15k Swift LOC Swift 2 3 使用 Xcode 8 2 1 编译 第三个 15k Sw
  • Bootstrap 4 向右浮动无法与导航栏一起使用[重复]

    这个问题在这里已经有答案了 这是代码 我需要将导航栏 没有徽标 移动到右侧 所以我添加了 float right 来喜欢 div class collapse navbar collapse float right 但它没有奏效 完整代码
  • 在 ASP.NET 单元测试中模拟 HttpContext.server.MapPath

    我在 ASP Net Web 应用程序中进行单元测试 现在我可以访问模型文件中的构造函数来测试其中是否有用于上传 XML 文件的 Server MapPath 代码 当尝试测试此代码时 我收到错误 因为 HttpContext 为 null
  • 函数使用 NRV 优化应遵循哪些规则

    我应该遵循哪些规则或技巧才能使函数能够在函数中使用 NRV 命名返回值 优化 我从不同的地方吸收了这些提示 但不知道我的理解是否正确 要返回的对象在函数内部不应该有任何名称 那为什么叫NAMED返回值优化 return 语句应该将对象用括号