2011-06-21 14 views
9
#include <iostream> 

using namespace std; 

class Test 
{ 
public: 
    Test() 
    { 
     printf("construct ..\n"); 
    } 

    ~Test() 
    { 
     printf("destruct...\n"); 
    } 
}; 

Test Get() 
{ 
    Test t = Test(); 
    return t; 
} 

int main(int argc, char *argv[]) 
{ 
    Test t = Get(); 
    return 0; 
} 

コンソール出力は次のとおりです。なぜデストラクタは一度だけ呼び出されましたか?

$ g++ -g -Wall -O0 testdestructor.cc 
$ ./a.out 

構文..

破壊...理由は、コンパイラによってコピーエリジオンの

+0

[コピーエリッションと戻り値の最適化とは何ですか?](http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) –

答えて

6

私は理由は 'ゲット' に戻り値の最適化であると仮定します。

http://en.wikipedia.org/wiki/Return_value_optimization

を見ては、実際にあなたのコードは、標準的な例ではありませんが、多分あなたのコンパイラがここにもそれを適用してもらいます。

10

そのあなたが関数から値を返します。この場合、コピー・エリミッションはRVO - 戻り値最適化と呼ばれます。

は、これらの

6

コンパイラの最適化を参照してください。

他のコンパイラ/最適化設定では、複数回呼び出されることがあります。

は、このコンパイルを参照してください:http://codepad.org/8kiVC3MM

出力:
1構築...
2自爆...
3自爆...
4自爆...
5自爆.. 。

コンパイラgen代わりにエラートコピーコンストラクタが呼び出されました。 http://codepad.org/cx7tDVDV

...私はあなたのコードの上に余分なコピーコンストラクタを定義した:

Test(const Test& other) 
{ 
    printf("cctor\n"); 
} 

出力:
1構築...
2 cctor

このコンパイルを参照してください。
3 destruct ...
4 cctor
5 destru CT ...
6 cctor
7消滅...
8自爆...

2

戻り値の最適化、つまりRVOと呼ばれます。

2

Try g++ -fno-elide-constructors(メッセージを出力するコピーコンストラクタを定義します)。

+0

はい、可能です-fno-elide-constructors私はすべてのデストラクタを見る – qiuxiafei

関連する問題