簡體   English   中英

返回值優化與右值參考

[英]return value optimization vs rvalue reference

我了解了返回值優化( C ++中的對象返回http://en.wikipedia.org/wiki/Return_value_optimization,http : //blog.knatten.org/2011/08/26/dont-be-afraid-of-按值返回(知道返回值優化/ )可防止臨時對象的生成。

我還了解了右值參考( 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;

首先,如果邏輯上要給調用者一個新對象,則應按值返回。 如果不能發生RVO,則將發生移動。 如果我不能移動,將復制一個。 移動通常不重要,但顯然取決於對象。 如果返回的非移動類型的復制成本很高,那么是否可以依賴RVO就會變得更加困難。 幸運的是,這種情況很少見。

RVO是如此廣泛的應用,它是相當困難的,使之不會發生。 我知道在某些編譯器上,返回值的三元語句會破壞它。 至少在VS中,NRVO不會在調試中發生。 因此,值得注意的是調試構建性能會受到影響。

查看上面為您的特定代碼編譯器生成的程序集,以查看這兩種情況是否相同。 很有可能是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM