重複の可能性:
戻り値の最適化と戻り値の理解 - C++
Integer
それがメンバーであるいくつかのクラスにしましょうi
。left
関数呼び出しにright
引数として渡され、型Integer
ブルース・エッケルで与えられたように。
コード 1:
return Integer(left.i+right.i);
コード 2:
Integer tmp(left.i+right.i);
return tmp;
コード 1 は、一時的な整数オブジェクトを作成してそれを返すことを示しており、名前付きローカル変数を作成してそれを返すこととは異なります。これは一般的な誤解です。
コード 1 では (一時的なアプローチを返すと呼ばれます):
コンパイラは、作成しているオブジェクトを返す必要が他にないことを認識していますbuilding the object directly into the location of the outside return value
。これには、単一の通常のコンストラクタ呼び出し (コピー コンストラクタなし) のみが必要であり、ローカル オブジェクトが作成されていないため、デストラクタは必要ありません。
コード 2 では 3 つのことが起こります:
a) コンストラクター呼び出しを含む tmp オブジェクトが作成されます
b) the copy-constructor copies the tmp to the location of the outside return value
。
c) スコープの最後で tmp のデストラクタが呼び出されます。
コード 1 で、これはどういう意味building the object directly into the location of the outside return value
ですか?
また、コード 1 でコピー コンストラクターが呼び出されないのはなぜですか?
また、コード 2 のステップ b が何をしているのかわかりませんでした。すなわちthe copy-constructor copies the tmp to the location of the outside return value
。