我了解了阻止临时对象生成的返回值优化(Object return in C++,http://en.wikipedia.org/wiki/Return_value_optimization,http://blog.knatten.org/2011/08/26/dont-be-afraid-of-returning-by-value-know-the-return-value-optimization/)。
我还学习了rvalue引用(http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html),它也可用于防止临时对象生成。
实际上,我可以返回值而不用担心复制对象导致的性能下降吗?
我的意思是,这两个代码片段是等效的吗?
A hello()
{
A a(20);
cout << &a << endl;
return a;
}
// rvalue reference to prevent temporary object creation
A&& a = hello();
cout << &a << endl;
// expects compiler remove the temporary object
A a = hello();
cout << &a << endl;
答案 0 :(得分:1)
如果逻辑想要给调用者一个新对象,首先应按值返回。如果RVO不能发生,则会发生移动。如果我搬不动,就会发生副本。移动通常是微不足道的,但它显然取决于对象。如果要返回复制成本昂贵的不可移动类型,那么您是否可以依赖RVO将变得更加困难。幸运的是,这应该是一种罕见的情况。
RVO的适用范围非常广泛,因此很难让它不发生。我知道在一些编译器中,返回值的三元语句会破坏它。至少在VS中,NRVO不会在调试中发生。因此,值得注意的是调试构建性能会受到影响。
查看编译器为上面的特定代码生成的程序集,看两种情况是否相同。它最有可能是。