ローカル変数を返すとオリジナルが破棄されますか?
C 17 以降では、ローカル変数を返すとコピーが返されるかオリジナルが破棄されますか最適化が有効かどうかによって異なります。
最適化あり(NRVO)
最適化 (名前付き戻り値最適化または NRVO と呼ばれる) を有効にすると、コンパイラーは、返されたオブジェクトをコピー/移動先のストレージに直接構築できます。これは、元のローカル変数が破棄されないことを意味します。
最適化なし
最適化が無効になっている場合 (-fno-elide-constructors を使用)、NRVO は無効になります。ローカル変数は通常どおり構築され、コピーまたは移動が実行され、元の変数は破棄されます。
例
次のコードを考えてみましょう。
class test { public: test(int p) { cout << "Constructor: " << this << endl; } test(test&& c) noexcept { cout << "Move Constructor: " << this << endl; } ~test() { cout << "Destructor: " << this << endl; } }; test function() { test i(8); return i; }
最適化された出力(NRVO):
Constructor: 0x7fff78e42887 Destructor: 0x7fff78e42887
最適化なしの出力:
Constructor: 0x7ffda9d94fe7 Move Constructor: 0x7ffda9d95007 Destructor: 0x7ffda9d94fe7 Destructor: 0x7ffda9d95007
最適化された場合、1 つのオブジェクトのみが構築および破棄されます。最適化されていない場合、一時コピーが作成されるため、2 つのオブジェクトが構築および破棄されます。
以上がC 17 でローカル変数を返すと元の変数が破壊されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。