返回值优化与右值参考

时间:2013-06-18 01:50:52

标签: c++ return-value rvalue-reference

我了解了阻止临时对象生成的返回值优化(Object return in C++http://en.wikipedia.org/wiki/Return_value_optimizationhttp://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;

1 个答案:

答案 0 :(得分:1)

如果逻辑想要给调用者一个新对象,首先应按值返回。如果RVO不能发生,则会发生移动。如果我搬不动,就会发生副本。移动通常是微不足道的,但它显然取决于对象。如果要返回复制成本昂贵的不可移动类型,那么您是否可以依赖RVO将变得更加困难。幸运的是,这应该是一种罕见的情况。

RVO的适用范围非常广泛,因此很难让它发生。我知道在一些编译器中,返回值的三元语句会破坏它。至少在VS中,NRVO不会在调试中发生。因此,值得注意的是调试构建性能会受到影响。

查看编译器为上面的特定代码生成的程序集,看两种情况是否相同。它最有可能是。