ホームページ > バックエンド開発 > C++ > C 11 の値型のデフォルトは値渡しであるべきですか?

C 11 の値型のデフォルトは値渡しであるべきですか?

Susan Sarandon
リリース: 2024-12-05 18:13:11
オリジナル
428 人が閲覧しました

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

C 11 の値渡し: 再評価

C 11 では、右辺値参照と移動コンストラクターの導入により、議論: 値渡しを値のデフォルトにするべきですtype?

参照渡しの起源

歴史的に、C で大きなオブジェクトを値で渡すことは、不必要なコピーのため非効率でした。コストのかかる重複を避けるために、参照パラメータが優先されました。ただし、参照によって、特にヒープに割り当てられたオブジェクトの場合、所有権とメモリ管理が複雑になります。

C 11 の新しいパラダイム

右辺値参照と移動コンストラクターを使用すると、値渡しが安価な std::vector や std::string などの値型を実装できるようになりました。ここで疑問が生じます: これらの型の新しい標準は値渡しであるべきでしょうか?

推奨事項

Dave Abrahams によると、次の場合は値渡しが推奨されます。関数内ではコピーが必要です。これにより、次の例に示すように、コンパイラーがコピーを最適化できるようになります。

void foo(T t)
{
    // ...
}
ログイン後にコピー

これは、lvalue、prvalue、または xvalue を渡すために柔軟に使用できます。

T lval;
foo(lval); // copy from lvalue
foo(T {}); // (potential) move from prvalue
foo(std::move(lval)); // (potential) move from xvalue
ログイン後にコピー

例外

const への参照渡しは、特定の場合には引き続き合理的なオプションです。コピーが不要または望ましくないシナリオ。このような場合、次の構文を使用できます。

class T {
    U u;
    V v;
public:
    T(U u, V v)
        : u(std::move(u))
        , v(std::move(v))
    {}
};
ログイン後にコピー

結論

C 11 では、値による受け渡しは、次のような値型の強力なオプションです。関数内でコピーする必要があります。これによりパラメータの処理が簡素化され、効率的な移動操作が可能になります。ただし、コピーが必要ない場合には、const への参照渡しが適切な代替手段として残ります。

以上がC 11 の値型のデフォルトは値渡しであるべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート