2

我了解了返回值优化(C++ 中的对象返回http ://en.wikipedia.org/wiki/Return_value_optimization,http : //blog.knatten.org/2011/08/26/dont-be-afraid-of- Return-by-value-know-the-return-value-optimization/)防止临时对象生成。

我还了解了右值引用(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;
4

1 回答 1

1

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

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

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

于 2013-06-18T02:09:00.433 回答