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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-10 01:48:131047ブラウズ

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

C での値渡しの再考 11

C の世界では、大規模なアプリケーションでは伝統的に値渡しが推奨されていません。パフォーマンス上の懸念からオブジェクトを削除します。ただし、C 11 での右辺値参照と移動コンストラクターの導入により、オブジェクトを効率的に渡すための新しい可能性が開かれています。

値による受け渡しが最適なデフォルトですか?

業界専門家の Dave Abrahams 氏によると、次のような場合には std::vector や std::string のような大きなオブジェクトを値で渡すのが合理的です。関数本体内でコピーを作成する必要があります。これにより、コンパイラが最適化を実行できるようになり、プログラマによる明示的なコピーの必要がなくなります。

利点:

  • 左辺値と左辺値の両方に対して最小限の作業のみが行われます。 prvalue 引数。
  • 呼び出し元の構文を簡素化し、参照渡しを可能にします。 pass-by-prvalue および pass-by-xvalue。

カスタム オブジェクト:

カスタム オブジェクトの場合、const への参照渡しは引き続き使用されます。柔軟性があり、元のファイルを意図せず変更してしまうリスクを最小限に抑えることができるため、実行可能なオプションです。 object.

ベスト プラクティス:

  • 関数内でコピーを作成する必要がある場合は、オブジェクトを値で渡します。
  • 右辺値参照を使用する移動セマンティクスを最適化する必要がある場合にのみ、
  • const への参照渡しを検討してください。不変性と所有権の明確性を確保するためのカスタム オブジェクト。

例:

推奨パターンを実装するには、値付きコンストラクターを次のように記述できます。

class T {
    U u;
    V v;
public:
    T(U u, V v)
        : u(std::move(u))
        , v(std::move(v))
    {}
};

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

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