NRVO其实就是RVO的一个变种或者是优化,理解了RVO也就理解了NRVO。。。 资料 更多资料可以参考 《More Effective C++》 条款20:协助完成“返回值优化(RVO)” 关注我,一起进步,人生不止coding!!!
返回值优化(RVO)/命名返回值优化(NRVO):这通常是与“构造返回对象”紧密相关的优化步骤,目的是减少不必要的对象拷贝。 异常处理:如果函数中有可能抛出异常,需要确保所有资源都能被正确清理。 清理局部资源:销毁函数内部的局部变量和临时对象。 传递返回值:这一步通常与“构造返回对象”和“返回值优化”紧密相关,涉及...
第一步可以被优化的拷贝构造就是上面的这种情况,即RVO(return value optimization),这时候只能在函数返回一个未命名变量的时候进行优化。 后来更进一步,可以在函数返回命名变量的时候也进行优化了,这就是NRVO(named return value optimization)。 但是这时候,还有一种情况不能优化的情况是:如果createA函数内部不同的分...
因为编译器自己做的RVO,NRVO优化,这当然是非标的。改一下编译选项可能就没啦。虽然gcc不显式关闭RVO的话,默认就开始的。但曾经我在C++98的环境下工作时,还是很少见到这种直接返回对象的写法。其实不是所有返回对象函数定义都能触发RVO,如果不清楚,C++98的程序员还是谨慎使用。 但是C++11开始,你不用担心了。 10. ...
(如果实验验证,会发现两行代码都调用String(char*)构造函数,这是因为大多数编译器都实行RVO/NRVO((具名)返回值优化)从而避免了临时对象的产生,但了解实际过程,写出不依赖于编译器优化的代码也是很重要的) 二、全局/静态变量(对象)的初始化 (参考自:http://bbs.csdn.net/topics/390527051?page=1 ...
在实际编程中使用返回引用时,紧记它最合适的场景,例如操作符重载、涉及大型对象或容器的函数返回,以及需要提供对类成员的修改能力时。 六、返回值优化与引用返回的对比分析 虽然现代C++编译器通过返回值优化(RVO)和命名返回值优化(NRVO)来减少或避免某些情况下的复制,但在那些优化不适用的情况下,使用引用返回仍然是避...
返回值优化(RVO)和命名返回值优化(NRVO)不适用时:当函数返回一个临时对象,且编译器不能应用RVO或NRVO优化时,移动构造函数和移动赋值运算符可以用来减少不必要的资源复制。 容器元素重新分配时:如std::vector在动态增加容量时,需要将旧元素移动到新分配的内存中,这时会触发移动构造函数或移动赋值运算符。 资源管理对象...
查找RVO和NRVO,并在C+0x移动-语义。在大多数情况下,在C+03中,OUT参数只是使代码变得丑陋的好方法,而在C+0x中,使用OUT参数实际上会对自己造成伤害。只需编写干净的代码,按值返回即可。如果性能是一个问题,分析它(停止猜测),并找到您可以做什么来修复它。它可能不会从函数中返回东西。这就是说,如果你已经下...
b)除了返回值优化,你可能还听说过一个叫具名返回值优化(NamedReturnValueOptimization,NRVO)的优化技术,从程序员的角度而言,它其实跟RVO同样的逻辑。只是它的临时对象具有变量名标识,例如修改上述get()函数为: Aget(){ Atmp(1);//#1 //dosomething returntmp; ...
2、返回值优化:RVO和NRVO 3、返回值优化策略的选择 4、const的基本使用 5、const的修饰对象的引用和函数 6、const、mutable和volatile 7、再谈构造函数--什么该做什么不该做 8、再谈构造函数--初始化顺序和参数列表 9、静态成员变量的初始化 10、CPP11中委托构造函数的使用 ...