2017-06-16 3 views
2

私は最近、C++の新しい移動セマンティクスに関する記事を読んでいます。大きなオブジェクトの戻り値を最適に実装する方法は混乱していました。結論は、コピーでの返却のように実装し、移動が最も効果的かどうかをコンパイラに決定させることでした。定数参照は、C++ 11以降でもベストプラクティスですか?

今私は、これが関数パラメータに対しても当てはまるのかどうか疑問に思いました。

は現在、私はこのようなconstの参照を使用します。代わりに、単純なコピーの

void setLargeObject(const LargeObject &obj) { 
    _obj = obj; 
} 

void setLargeObject(LargeObject obj) { 
    _obj = obj; 
} 

をconst参照によって渡された大きなオブジェクトをコピーするためのパラメータは、まだベストプラクティスもされていますC++ 11以降では?

+0

私はそう信じています、参照は大きなオブジェクトに比べて無重力です。 – Vivick

+1

コンパイラは、返される値が移動できることを知ることは簡単だと思います(範囲外になるローカル変数の場合はesp)。私はそれがパラメータに関してそれを知ることはとても簡単だとは思わない。 – Steve

答えて

2

プロパティを設定する場合は、値の所有権を取得する必要があり、値渡しが必要です。パラメータが初期化されると、必要に応じて関数呼び出しの前にコピーされます。機能の中で、その場所に移動します。 LargeObjectが移動セマンティクスを(そうたstd::moveは何も変化しない)をサポートしていない場合

void setLargeObject(LargeObject obj) { 
    _obj = std::move(obj); 
} 

、あなたは一つのコピーの代わりに、2つにパフォーマンスヒットを制限するconst&を使用する場合があります。しかし、最も良い解決策は、可動性を追加することであり、const&のままではありません。

関連する問題