ホームページ  >  記事  >  バックエンド開発  >  C 17 でローカル変数を返すとコピーが返され、元の変数が破棄されますか (NRVO)?

C 17 でローカル変数を返すとコピーが返され、元の変数が破棄されますか (NRVO)?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-22 06:50:15387ブラウズ

Does Returning a Local Variable in C  17 Return a Copy and Destroy the Original (NRVO)?

ローカル変数を返すとコピーが返され、元の変数が破棄されますか (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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。