ローカル変数を返すとコピーが返され、元の変数が破棄されますか (NRVO)?
C 17 では、最適化が有効になっている場合 (具体的には戻り値の最適化 (NRVO) と呼ばれる)、ローカル変数を返す場合、元のオブジェクトのコピーは必要ありません。代わりに、コンパイラはコードを最適化し、返されたオブジェクトをストレージに直接構築し、そこにコピーされます。これは、元のオブジェクトが戻り値の場所に事実上移動され、デストラクターが呼び出されないことを意味します。
ただし、最適化が (-fno-elide-constructors フラグを使用して) 無効になっている場合は、デフォルトの動作に従います。 :
指定したコード内:
test function() { test i(8); return i; }
NRVO が有効な場合のみ1 つのコンストラクターとデストラクターの呼び出しが観察され、元の i オブジェクトが何もせずに戻り値の場所に移動されることを示しています。
NRVO を無効にすると、元の i オブジェクトと戻り値オブジェクトの両方でコンストラクター呼び出しとデストラクター呼び出しの両方が観察され、元の i オブジェクトがコピーされてから破棄されたことがわかります。
したがって、質問に対する答えは、最適化が有効かどうかによって異なります。 NRVO を有効にすると、ローカル変数を返してもコピーは返されず、元の変数は破壊されません。 NRVO を無効にすると、コピーが返され、オリジナルは破棄されます。
以上がC 17 でローカル変数を返すとコピーが返され、元の変数が破棄されますか (NRVO)?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。