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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 18:13:11418ブラウズ

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 サイトの他の関連記事を参照してください。

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