元のコード
#include <iostream>
int global;
struct A
{
A(){}
A(const A&x){
++global;
}
~A(){}
};
A foo()
{
A a;
return a;
}
int main()
{
A x = foo();
std::cout << global;
}
出力は0
、名前付き戻り値の最適化をサポートする最適化されたコンパイラで行われます。
の定義を変更するfoo
と
A foo()
{
{
A a;
return a;
}
}
出力として取得1
します。つまり、コピー c-tor が 1 回呼び出されます。考えられる理由は何ですか?ダミー スコープを導入すると、コードの動作が完全に変わります。私は何が欠けていますか?
g++ コンパイラでテストしました。実装固有の方法でシナリオを説明できるコンパイラ担当者はいますか?
編集
clang でテストしたところ、2 番目のケースでもコピー c-tor の呼び出しが最適化されました。
Andrew Pinski (gcc 担当者) は、これが実際に g++ の最適化を逃したケースであることを確認しました。