[英]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.