main:A a,b;
には 2 つのオブジェクトがあり、 function f()
:の本体には 1 つのオブジェクトA b;
があり、コピーされる一時オブジェクトとそのコピーが に格納されb
ます。
関数の本体に戻るb
と、最初にコピーが作成され、次にローカルが破棄され、次にコピーがメインで宣言b
された変数に割り当てられ、次にこのコピーが破棄されます。b
次の行をクラスA
定義に追加して、自分自身を確認してください。
A(const A&) { cout << "copying" << endl; }
Named Return Value Optimizationを使用すると、コンパイラは冗長な Copy コンストラクターと Destructor 呼び出しを排除しようとしますb
。これは、コピーが作成されることなく、関数のローカルが main のf()
変数に割り当てられることを意味します。b
したがって、RVO / NRVO では、3 つのオブジェクトのみが作成されます。
あなたの場合、RVOなしでこのコピーを破壊しないようにする方法はありますが:
A a;
A b = a.f();
この場合、関数の戻り値のコピーf()
が作成され、変数として保存されますb
。これは、代入演算子が呼び出されず、2 つのオブジェクトのみが main: で作成され、によって返されるa
のコピーが作成されることも意味します。b
f()
お役に立てれば。