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

C 17 でローカル変数を返すと元の変数が破壊されますか?

DDD
DDDオリジナル
2024-11-11 11:22:03835ブラウズ

Does Returning a Local Variable in C  17 Destroy the Original?

ローカル変数を返すとオリジナルが破棄されますか?

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 サイトの他の関連記事を参照してください。

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