C で名前付きオブジェクトを値で返す場合、暗黙的な移動ルールはどのように機能しますか?

DDD
リリース: 2024-11-04 06:20:02
オリジナル
170 人が閲覧しました

How does the Implicit Move Rule work when returning a named object by value in C  ?

クラスの名前付きオブジェクトを値で返すと暗黙的な移動ルール

関数からクラスのオブジェクトを値で返す場合、暗黙的な移動ルールが適用されます。遊びに。このルールは、戻り値を保持する一時オブジェクトを構築するときのコンパイラの動作を制御します。

例 1:

次のコード スニペットを考えてみましょう。

<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) が表示されます。

例 2:

次に、代わりにコピー コンストラクターを使用するように 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!