関数からクラスのオブジェクトを値で返す場合、暗黙的な移動ルールが適用されます。遊びに。このルールは、戻り値を保持する一時オブジェクトを構築するときのコンパイラの動作を制御します。
次のコード スニペットを考えてみましょう。
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(const test& z) { printf("test(const test&z)\n"); } test(test&& s)noexcept { printf("test(test&& s)\n"); } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
出力:
test() test(test&& s)
この例では、関数 Some_thing は、デフォルトのコンストラクターを使用して構築された、テスト クラスの名前付きオブジェクトを返します。コンパイラーは NRVO (戻り値の最適化という名前) によりコピーを省略できるため、デフォルトのコンストラクター test() の出力に続いて暗黙的な移動コンストラクター test(test&& s) が表示されます。
次に、代わりにコピー コンストラクターを使用するように Some_thing 関数を変更しましょう。
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(test& z) { printf("test(test&z)\n"); } test(test&& s)noexcept { printf("test(test&& s)\n"); // Deleted this constructor } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
出力:
test() test(test&z)
驚くべきことに、このコードはコンパイルおよび実行も可能です。ただし、移動コンストラクターは定義されていません。これは、暗黙的な移動ルールが式 i が「移動適格」かどうかをチェックするためです。この場合、i は移動適格なローカル変数です。したがって、コンパイラは引き続きコピー操作を省略できます。
暗黙的な移動ルールは、オブジェクトを値で返し、次の条件が満たされた場合にトリガーされます。
暗黙的な移動ルールは、オブジェクトを値で返す効率的かつ簡潔な方法を提供します。コードを最適化し、不必要なコピーを減らし、パフォーマンスを向上させるのに役立ちます。ただし、その制限を理解し、適切な考慮なしに使用すると潜在的な問題が発生する可能性があることに注意することが重要です。
以上がC で名前付きオブジェクトを値で返す場合、暗黙的な移動ルールはどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。