2012-05-09 9 views
6

移動セマンティクスは、コンパイラがRVONRVOを使用できない場合に便利です。しかし、コンパイラはこれらの機能を使用できませんか?コンパイラはいつRVOまたはNRVOを使用できませんか?

+0

チェックをこの質問:[C++:「戻る」ステートメントを使用してコピーを回避](http://stackoverflow.com/questions/10476665/c-avoiding-copy-with-the- return-statement):) – LihO

答えて

5

答えはコンパイラと状況に依存するということです。例えば。制御フローの分岐によってオプティマイザが混乱する可能性があります。 Wikipediaこの例与える:

#include <string> 
std::string f(bool cond = false) { 
    std::string first("first"); 
    std::string second("second"); 
    // the function may return one of two named objects 
    // depending on its argument. RVO might not be applied 
    return cond ? first : second; 
} 

int main() { 
    std::string result = f(); 
} 
3

コンパイラがRVOを使用できるかどうかはそれほど重要ではありませんが、それによってコピーの作成を回避できるかどうかはわかりません。

を考えてみましょう:

struct Blah 
{ 
    int x; 
    Blah(int const _x): x(_x) { cout << "Hum de dum " << x << endl; } 
}; 

Blah foo() 
{ 
    Blah const a(1); 
    if(fermatWasRight()) { return Blah(2); } 
    return a; 
} 

は(コンストラクタからの出力)右ここ副作用の取得、一目見ただけで、呼び出し側が提供するストレージでa directyを構築するとかなり互換性がありません。しかし、コンパイラが十分にスマートな場合、このオブジェクトを破棄するとnull操作であることに気付くことができます。さらに一般的には、特定の状況では、コンパイラが十分にスマートであれば、コードをどのように巧妙に設計してもコピー操作を避けることができます。

私は正式なのか分かりませんが、上記のように、オブジェクトにペイロードが多く、コピーがより高価になるため、移動セマンティクスが役立つ場合があります。したがって、最適化は保証されますコンパイラのスマート(またはそうではない)。

関連する問題