移動セマンティクスは、コンパイラがRVOとNRVOを使用できない場合に便利です。しかし、コンパイラはこれらの機能を使用できませんか?コンパイラはいつRVOまたはNRVOを使用できませんか?
6
A
答えて
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操作であることに気付くことができます。さらに一般的には、特定の状況では、コンパイラが十分にスマートであれば、コードをどのように巧妙に設計してもコピー操作を避けることができます。
私は正式なのか分かりませんが、上記のように、オブジェクトにペイロードが多く、コピーがより高価になるため、移動セマンティクスが役立つ場合があります。したがって、最適化は保証されますコンパイラのスマート(またはそうではない)。
関連する問題
- 1. RVO/NRVOが起動したときにオブジェクトがコピーされるかどうか?
- 2. CLionは正しいコンパイラを使用していませんか?
- 3. C++インタプリタ(コンパイラではありません)を使用しましたか?
- 4. 永遠のスクリプトを使用したNodejsはいつかアクセスできません
- 5. Intellijと組み合わせたTomcat IDEA:コンパイラを使用できません
- 6. SelectParameterは使用できませんか?または@
- 7. Swift 3.2コンパイラはDarwin.keventグローバル関数を使用させません
- 8. 'ダイナミック'コンパイラを使用するクラスまたはメンバを定義できません必要な型 'System.Runtime.CompilerServices.DynamicAttribute'が見つかりません
- 9. qtcreatorは指定されたコンパイラを使用していません
- 10. アンドロイドスピナードロワブルは使用できませんか?
- 11. チャートコントロールは使用できませんか?
- 12. repaint()は使用できませんか?
- 13. onchangeは使用できませんか?
- 14. mexを使用しているMATLABにC++コンパイラが見つかりません
- 15. 403「GoogleスライドAPIはプロジェクトで使用されていません...前または使用できません」
- 16. コンパイラはなぜ '_FILE_'を理解できませんか?
- 17. PROTOBUFコンパイラが見つかりません
- 18. MonoTouch:gccコンパイラが見つかりません
- 19. そのため、コンパイラは汎用クラスのコンストラクタ型を推論できません。
- 20. ローカルシステムデータの使用は、ハイパージーガーチェーンコードでは使用できませんか?
- 21. コンパイラはコピー代入を使用しません。
- 22. _ArrayTypeまたは_ArrayProtocolはSwift 3.1では使用できませんか?
- 23. は$ .getJSONを使用できません
- 24. Node.jsを使用またはアンインストールできません
- 25. 経路またはパラメータにピリオドを使用できません
- 26. マングースエラー:$または文字列を使用できません
- 27. IntellijにAspectJコンパイラを使用させることができません
- 28. highchartsを使ったAngular4はworld.jsを使用できません
- 29. Javaコンパイラでタイプ引数を持つ汎用メソッドが見つかりません
- 30. コンパイラはWP7のクラスJpegBitmapEncoderを見つけることができません
チェックをこの質問:[C++:「戻る」ステートメントを使用してコピーを回避](http://stackoverflow.com/questions/10476665/c-avoiding-copy-with-the- return-statement):) – LihO