【问题标题】:return value optimization vs rvalue reference返回值优化与右值引用
【发布时间】:2013-06-18 01:50:52
【问题描述】:

我了解了防止临时对象生成的返回值优化(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/)。

我还了解了右值引用 (http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html),它也可用于防止临时对象生成。

实际上,我可以只返回值而不用担心复制对象的性能下降吗?

我的意思是,这两个代码 sn-p 等效吗?

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;

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 2013-02-02
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多