名前付き戻り値の最適化 (NRVO) はローカル変数の戻り動作にどのような影響を与えますか?

Barbara Streisand
リリース: 2024-11-09 09:03:02
オリジナル
778 人が閲覧しました

How Does Named Return Value Optimization (NRVO) Affect Local Variable Return Behavior?

ローカル変数の戻り動作を理解する

関数からローカル変数を返すとき、その動作はコンパイラの最適化によって異なる場合があります。

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 が有効な場合、ローカル変数を返すと、コピーが必要な場合は、戻りサイトでオブジェクトを直接構築し、元のオブジェクトを破棄します。
  • NRVO を無効にすると、オブジェクトのコピーが作成されて返され、オブジェクトのコピーが 2 つ作成されます。

以上が名前付き戻り値の最適化 (NRVO) はローカル変数の戻り動作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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