省略とオブジェクトの有効期間のコピー
ローカル変数を値で返すとき、元のオブジェクトが破棄されるかどうか疑問に思うかもしれません。答えは、コピー省略を理解することにあります。
コピー省略 (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 サイトの他の関連記事を参照してください。