ローカル変数の戻り動作を理解する
関数からローカル変数を返すとき、その動作はコンパイラの最適化によって異なる場合があります。
NRVO (名前付き戻り値)最適化)
NRVO が有効な場合、コンパイラは戻り値のサイトに直接返されるオブジェクトを作成することで return ステートメントを最適化します。この場合、コピーは実行されず、元のオブジェクトは復帰後に破棄されます。
NRVO を有効にした出力
// With NRVO enabled, only one constructor and destructor call is made. class test { public: test(int p) { std::cout << "Constructor (test(int p)) called\n"; } ~test() { std::cout << "Destructor called\n"; } }; test function() { test i(8); return i; } int main() { test o = function(); return 0; }
出力:
Constructor (test(int p)) called Destructor called
NRVO無効
NRVO を無効にするには、コンパイル中に -fno-elide-constructors フラグを使用します。この場合、コンパイラは NRVO を実行せず、戻り値にオブジェクトのコピーが作成されます。
NRVO による出力無効
// With NRVO disabled, both constructor and destructor calls are made twice. class test { public: test(int p) { std::cout << "Constructor (test(int p)) called\n"; } test(test&& other) { std::cout << "Constructor (test(test&& other)) called\n"; } ~test() { std::cout << "Destructor called\n"; } }; test function() { test i(8); return i; } int main() { test o = function(); return 0; }
出力:
Constructor (test(int p)) called Constructor (test(test&& other)) called Destructor called Destructor called
概要
以上が名前付き戻り値の最適化 (NRVO) はローカル変数の戻り動作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。