2012-08-12 92 views
0

考慮同樣的功能返回值優化

Object foo() 
{ 
    Object ret; 
    ret.a.set(...); 
    ret.b.set(...); 
    return ret; 
} 

Object foo() 
{ 
    A a; 
    a.set(...); 

    B b; 
    b.set(...); 

    return Object(a, b); 
} 

以下兩種實現方式假設A ::設置和B ::組必須建成後調用。另外,假設Object,A和B都有移動構造函數,不會複製大量的數據。最後,假設編譯器執行RVO和NRVO。

其中哪些在對象構造方面更高效?

+6

取決於對象,編譯器優化等只是簡介它 – 2012-08-12 18:41:25

+0

[瞭解返回值的優化和返回臨時工 - C++](http://stackoverflow.com/questions/1394229) – Blastfurnace 2012-08-12 19:56:10

+0

爲什麼構造函數不採取它需要完全構建對象的參數。只要這不是瓶頸(你應該能夠證明這一點)。然後代碼應該以最容易編寫和維護的方式編寫。 – 2012-08-12 20:04:55

回答

0

如果此實現使用3個子對象(A,B,C),那麼後者似乎更有效,因爲對新創建的對象的成員值調用較少。不過,我認爲它確實沒有什麼區別。我只會選擇你認爲最可讀的。

0

假設 - 因爲你沒有給出太多的上下文 - 成員a和b是向量狀的,並且集合函數用元素「填充」這個向量狀對象, Object複製的參數構造函數從參數中構造成員a和b ...並假定您的編譯器能夠執行NRVO而不僅僅是RVO(現在很常見)......第一個函數應該更高效,因爲您不必以這種方式複製a和b。