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