次のコードは、デストラクタ4回呼び出して呼び出しますか? 私は3つのデストラクタコールしかないはずだと考えていました。戻り値の最適化 - - C++デストラクタは
答えて
コンパイラは最適化しませんでした。最適化を有効にしてコンパイルしましたか? main()
で2つのオブジェクトがあります
A
A
F
A
~A
~A
~A
ので、デストラクタは、という理由だけで、それらの回呼び出されます。ここでは
は、同じコードの出力、gccでコンパイルされています。f()
のオブジェクトの1つで、デストラクタは
という1つで、と呼ばれます。合計3回(期待通りですが、読み込み中...)
f
から戻ったときに作成される一時オブジェクトに対して4回目のデストラクタが呼び出されました。これは、RVOがまったくない場合にのみ発生します。 RVOはコンパイラの選択です。つまり、コンパイラが最適化するか、コンパイルできない可能性があります。この言語はRVOの保証をしません。
とにかく、最適化レベルを上げてください。あなたは3つのデストラクタ呼び出ししか見ることはできません。
RVOを使用することはできません。そのため、デストラクタやコピーコンストラクタ内に関数ロジックを置くべきではありません(そうです、それらも省略できます)。
戻り値の最適化は、標準で許可されているものですが、強制しません。
最適化やO2を使用しないと、私も4つのデストラクタ呼び出しを取得します。あなたが機能f()
から戻っているときに、オブジェクトb
の一時的なコピーが作成されます。完全な最適化と
- - 牛私は3
A
のインスタンスの1つの隠れ創造と破壊がありますを取得します。それはb
に割り当てられ、main()
になり、その後破棄されます。
彼はRVOが起こらない理由を尋ねています。 –
@Luchianあなたが正しいですが、使用された最適化レベルは言及されていないので、私は価値あるもので戻ってきたときに一時的に見落とした印象を受けました。 –
f
のローカル変数は、関数が戻るときに一時変数にコピーされます。そのため、4つのデストラクタ呼び出しがあります。 (コピー操作は、コピーコンストラクタA(A&)
なく、あなたのデフォルトコンストラクタA()
、それ故に3 A
秒を呼び出します。)
それは問題ではありません。彼は戻り値の最適化がなぜ適用されないのか尋ねています。 –
私は彼/彼女がRVOを知っているか分からない。問題は単に「3つではなく4つのデストラクタ呼び出しがあるのはなぜですか?」私はそれに答えた。 –
タイトルを読んだことがありますか? –
メインで2つのオブジェクトがありますA a,b;
、1つの目的は、機能f()
のボディに:A b;
、その後、一時オブジェクトそれがありますがコピーされ、そのコピーがb
に格納されています。
関数の本体にb
を返すと、最初にコピーが作成された後、ローカルb
が破壊され、copyが変数b
に割り当てられ、このコピーが破棄されます。
クラスA
定義に次の行を追加して、自分自身を参照してください。コンパイラは、冗長コピーコンストラクタを排除しようとデストラクタが機能f()
からローカルb
が割り当てられることを意味しを呼び出しNamed Return Value Optimizationで
A(const A&) { cout << "copying" << endl; }
を、コピーを作成せずにメインの変数b
に書き込んでください。したがって、RVO/NRVOでは、3つのオブジェクトしか作成されません。
あなたのケースでRVOせずにこのコピーを破壊避けるためにどのような方法がありますが:
A a;
A b = a.f();
この場合、機能f()
の戻り値のコピーが変数b
として作成されて記憶されます。また、アサイメント演算子が呼び出されず、メインには2つのオブジェクト(a
およびb
)が返されます。f()
が返されます。
これが役に立ちます。
- 1. C++の戻り値の最適化
- 2. タプル/タイの戻り値の最適化
- 3. VC2008での戻り値の最適化
- 4. C++の戻り値の最適化、複数の無名の戻り
- 5. 戻り値の最適化(RVO)Cに一時を用い++
- 6. のuint32_tデストラクタの戻り値
- 7. C++コンパイラは未使用の戻り値を `reference`で最適化しますか?
- 8. 大きな値のベクトルに対する戻り値の最適化とauto_ptr
- 9. リターン値の最適化と一時的な戻りの理解 -
- 10. g ++の戻り値の最適化を無効にする
- 11. C++の最適化
- 12. C++の最適化
- 13. Visual Studio 2010で戻り値の最適化を無効にする方法は?
- 14. C++の値とデストラクタ?
- 15. ループ最適化C#
- 16. C++インライン最適化
- 17. コピーコンストラクタの呼び出しと戻り値の最適化を理解
- 18. C#のグラフレイアウトの最適化
- 19. C++ Palindrome finderの最適化
- 20. C++コンパイラの最適化
- 21. C#コードフラグメントの最適化
- 22. C#コードの最適化
- 23. C#コード/ハードコードの最適化
- 24. OpenCV/C++の最適化ヘルプ
- 25. OpenMPの最適化とC
- 26. 最適化データ型(C#の)
- 27. C#ニューラルネットワークの最適化
- 28. Visual C++コンパイラの最適化
- 29. C#Double Foreachの最適化
- 30. ネストされた関数呼び出しによるC++の名前付き戻り値の最適化
いいえ、そうではありません。 http://ideone.com/ywGdo –
おっと!私はCodepadを使いました.. http://codepad.org/1OJGoYGP – Venky
C++に関する質問に「c」を付けないでください。言語は同じではありません。 – tinman