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