#include<iostream>
using namespace std;
class A{
public:
static int cnt;
A()
{
++cnt;
cout<<"constructor:"<<cnt<<endl;
}
~A()
{
--cnt;
cout<<"destructor:"<<cnt<<endl;
}
};
int A::cnt = 0;
A f(A x){
return x;
}
int main(){
A a0;
A a1 = f(a0);
return 0;
}
プログラムが出力されます:デストラクタがコンストラクタより頻繁に呼び出されるように見えるのはなぜですか?
constructor:1 destructor:0 destructor:-1 destructor:-2
コンストラクタとデストラクタはペアで表示されないのですか?
ようこそスタックオーバーフロー! +1と完全なサンプルプログラムを提供していただきありがとうございます。それがなぜ重要だったのかについては、http://SSCCE.ORGを参照してください。 –
'return x;'によって呼び出されたコピーコンストラクタはすでに明らかに最適化されていますが、十分に積極的なオプティマイザが 'f'(' x'が値渡し)を呼び出すときに呼び出しを取り除くことができるかどうか疑問です。そのため、効果的にデフォルトのデストラクタを呼び出してからコピーコンストラクタを呼び出します。 –
@FrerichRaabe:その最適化は、特定の状況でのみコピーコンストラクタのエリートを許可する標準に準拠しないことになります。許可されたすべての状況において、省略されたコピーのソースまたは宛先は一時的なものです。 –