ローカル変数を値で返すと元のオブジェクトが破壊されますか?

DDD
リリース: 2024-11-09 13:15:02
オリジナル
811 人が閲覧しました

Does Returning a Local Variable by Value Destroy the Original Object?

省略とオブジェクトの有効期間のコピー

ローカル変数を値で返すとき、元のオブジェクトが破棄されるかどうか疑問に思うかもしれません。答えは、コピー省略を理解することにあります。

コピー省略 (NRVO) を使用する

最適化 (名前付き戻り値最適化 (NRVO) と呼ばれる) が有効になっている場合、コンパイラはreturn ステートメントを最適化するには、コピー先となるストレージにオブジェクトを直接構築します。その結果、元のオブジェクトは最初から作成されません。

NRVO を有効にした例

次のコードを考えてみましょう:

class Test {
public:
    Test(int p) { cout << "Constructor called" << endl; }
    ~Test() { cout << "Destructor called" << endl; }
};

Test function() {
    Test t(5);
    return t;
}

int main() {
    Test o = function();
    return 0;
}
ログイン後にコピー

NRVO を有効にすると、出力は次のようになります。

Constructor called
Destructor called
ログイン後にコピー

オブジェクト o のみが構築および破棄され、元のオブジェクト t は最適化されて削除されます。

コピー省略なし

最適化が無効な場合 (-fno-elide-constructors など)、return ステートメントは通常のコピー/移動セマンティクスに従います。

NRVO が無効な場合の例

NRVO を無効にして上記のコードを使用すると、出力は次のようになります。

Constructor called
Constructor called
Destructor called
Destructor called
ログイン後にコピー

今回は、コピー/移動構築ではできないため、オブジェクト t と o の両方が構築および破棄されます。

結論

ローカル変数を値で返すと元のオブジェクトが破壊されるかどうかは、NRVO が有効かどうかによって決まります。 NRVO を使用すると、元のオブジェクトは削除される可能性がありますが、NRVO を使用しない場合は、標準のコピー/移動セマンティクスに従ってコピー/移動されます。

以上がローカル変数を値で返すと元のオブジェクトが破壊されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート