ホームページ  >  記事  >  バックエンド開発  >  オブジェクトを値で返すと移動コンストラクターがトリガーされるのはどのような場合ですか?

オブジェクトを値で返すと移動コンストラクターがトリガーされるのはどのような場合ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-04 08:51:30325ブラウズ

When Does Returning an Object by Value Trigger a Move Constructor?

値によって関数からクラスのオブジェクトを返す

関数からクラスのオブジェクトを値によって返す場合を考えてみましょう。価値。このシナリオでは、返されるオブジェクトは通常、左辺値とみなされます。これは、オブジェクトがメモリ内に名前とアドレスを持っていることを意味します。ただし、特定の状況では、返されたオブジェクトが右辺値、つまり名前やアドレスのない一時オブジェクトとして扱われる可能性があります。

暗黙的な移動ルール

C では、オブジェクトを値で返すときに適用される暗黙的な移動ルール。このルールは、次の条件が満たされる場合に指定します。

  • 返される式は xvalue (左辺値ではない一時オブジェクトを示す式) です。
  • The class of the返されたオブジェクトには移動コンストラクターがあります。
  • 移動コンストラクターはアクセス可能です。

このような場合、コピー コンストラクターの代わりに移動コンストラクターが呼び出されます。この動作は、不必要なコピーを回避してパフォーマンスを最適化することを目的としています。

例 1

この例では、返されるオブジェクト i は左辺値であるため、コピー コンストラクター test( const test& z) が呼び出されます:

<code class="cpp">class test {
public:
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(const test&amp; z) { printf("test(const test&amp;z)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>

出力:

test()
test(const test&amp;z)

例 2

ただし、次の例では、返されたオブジェクト i は xvalue として扱われ、オブジェクトは一時的であり、移動コンストラクターが実行可能であるため、移動コンストラクター test(test&& s) が呼び出されます:

<code class="cpp">class test {
public:
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(test&amp;&amp; s) { printf("test(test&amp;&amp; s)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>

出力:

test()
test(test&amp;&amp; s)

例 3

移動コンストラクターが提供されていないか明示的に削除されている場合、暗黙的な移動ルールを適用できず、プログラムはコンパイルに失敗します。

<code class="cpp">class test {
public:
    test(test&amp;&amp; z) = delete;
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(const test&amp; z) { printf("test(const test&amp;z)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>

結論

オブジェクトを値で返す場合、特定の条件下で暗黙的な移動ルールが適用され、移動コンストラクターが呼び出される場合があります。この動作を理解することは、コードを最適化し、コンパイル エラーを防ぐために非常に重要です。

以上がオブジェクトを値で返すと移動コンストラクターがトリガーされるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。