ホームページ >バックエンド開発 >C++ >C 11 では、ラージ オブジェクトに対して値渡しをデフォルトにする必要がありますか?

C 11 では、ラージ オブジェクトに対して値渡しをデフォルトにする必要がありますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-02 17:35:11454ブラウズ

Should Pass-by-Value Be the Default in C  11 for Large Objects?

C での値渡しの再考 11

従来の C では、関数に値渡しを行うと、大きなオブジェクトのパフォーマンスが低下しました。 。そのため、C プログラマーは参照渡しを選択し、速度は向上しましたが、特にヒープ割り当てオブジェクトの所有権とメモリ管理に複雑さが生じました。

C 11 では、Rvalue 参照と移動コンストラクターが導入され、効率的な受け渡しが可能になりました。 std::vector や std::string などの大きなオブジェクトの -value。このため、値による受け渡しをそのような型のデフォルトにするべきかどうかという疑問が生じます。

値による受け渡し: 新しいデフォルト?

Dave Abrahams によると、関数内でコピーが必要な場合は、値渡しが好ましいデフォルトとなります。コンパイラーがコピーを処理できるようにすることで、プログラマは明示的なコピー操作を回避できます。

void foo(T t) {
    // ...
}

参照渡しと比較して:

void foo(T const& t) {
    auto copy = t;
    // ...
}

値渡しは呼び出し側に柔軟性をもたらします。 :

T lval;
foo(lval); // copy from lvalue
foo(T {}); // (potential) move from prvalue
foo(std::move(lval)); // (potential) move from xvalue

の例外値による受け渡し

値による受け渡しは一部の型に適していますが、const への参照による受け渡しは引き続き合理的なオプションです。

  • オブジェクトコピーすべきでないもの: 参照を渡すことで、不必要なコピーが作成されなくなります。
  • ラージ オブジェクト値によって頻繁に渡されるもの: 移動セマンティクスを使用しても、コピー操作は依然として高コストになる可能性があります。
  • スレッド間で転送されるオブジェクト: 参照による受け渡しにより、効率的なスレッド同期が可能になります。

以上がC 11 では、ラージ オブジェクトに対して値渡しをデフォルトにする必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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