6.3 RVO与NRVO的应用场景 RVO通常用于那些创建并返回临时对象的简单函数,而NRVO则更适用于那些有多个返回路径和更复杂逻辑的函数。 6.4 代码示例 // RVO示例MyClass func1() {return MyClass();}// NRVO示例MyClass func2(bool flag) {MyClass obj1, obj2;if (flag) {// do something with obj1return ...
在这里想说的是,新标准的诞生总是带着解决某个问题的目的而来,随着新标准的普及,我们应该紧跟发展的脚步,虽不能说做到形影不离,但也不能让自己落后得太远。 NRVO NRVO其实就是RVO的一个变种或者是优化,理解了RVO也就理解了NRVO。。。 资料 更多资料可以参考 《More Effective C++》 条款20:协助完成“返回值优...
六、返回值优化与引用返回的对比分析 虽然现代C++编译器通过返回值优化(RVO)和命名返回值优化(NRVO)来减少或避免某些情况下的复制,但在那些优化不适用的情况下,使用引用返回仍然是避免性能损失的有效方法。 相关问答FAQs:为什么在C++成员函数后要加上“&”? 在C++中,将成员函数声明为成员函数后加上“&”表示这是一...
(细节实际上更复杂,但对于像int这样的平凡类型,最终结果是相同的。对于non-trivial类型,编译器在这种情况下可能不允许重用内存,尽管以下段落仍然可以有相同的effect.) 此外,编译器可以应用so-called命名的返回值优化(NRVO),这允许编译器将临时对象和t视为引用同一对象,从而跳过任何必要的副本。在这种情况下,地址也可以...
它禁用了构造函数优化,特别是返回值优化(RVO)和命名返回值优化(NRVO)。在某些情况下,当对象从函数返回时,编译器可能会省略某些构造函数和析构函数调用,以提高性能。这种优化在大多数情况下都是有益的,但在学习或调试时,可能希望看到所有的构造函数和析构函数调用,这时可以使用这个标志。
不,return语句允许隐式地将返回值视为右值,使其可以隐式移动并且不需要显式return std::move(...);(这可以防止RVO / NRVO,实际上使return std::move(...);成为反模式)。因为add在return语句中被视为rvalue,因此lambda被移动到std::function<>构造函数参数中。
(如果实验验证,会发现两行代码都调用String(char*)构造函数,这是因为大多数编译器都实行RVO/NRVO((具名)返回值优化)从而避免了临时对象的产生,但了解实际过程,写出不依赖于编译器优化的代码也是很重要的) 二、全局/静态变量(对象)的初始化 (参考自:http://bbs.csdn.net/topics/390527051?page=1 ...
其实C++11之前也有这么用的。因为编译器自己做的RVO,NRVO优化,这当然是非标的。改一下编译选项可能就没啦。虽然gcc不显式关闭RVO的话,默认就开始的。但曾经我在C++98的环境下工作时,还是很少见到这种直接返回对象的写法。其实不是所有返回对象函数定义都能触发RVO,如果不清楚,C++98的程序员还是谨慎使用。
但是,这需要编译器进行 NRVO,然后也跳过返回值的副本(这也是合法的,但不是必需的)。在实践中,我希望任何 C++ 编译器都能够对其进行优化,使其与直接初始化一样快。原文由 Pavel Minaev 发布,翻译遵循 CC BY-SA 3.0 许可协议 有用 回复 撰写回答 你尚未登录,登录后可以 和开发者交流问题的细节 关注并接收...
但是在第一种情况下,如果它可以为该功能执行NRVO,则可以自由地完全优化移动。如果由于某些原因无法使用NRVO,则只有编译器才会诉诸move构造函数。因此,如果x是要从中返回的函数中的本地非静态对象,请不要将return x;更改为return std::move(x);,否则您将阻止编译器使用其他优化机会。