C++ で値渡しよりも参照渡しの方がコストがかかる場合はありますか? もしそうなら、それはどのようなケースですか?
4 に答える
プリミティブ型 (int、char、float など) と、安価にコピーできる POD 構造体 (Point、complex) を値で渡すことを優先します。
これは、参照渡し時に必要な間接参照よりも効率的です。
Boost の Call Traitsを参照してください。
テンプレート クラス
call_traits<T>
は、関数との間で何らかの型 T のパラメーターを渡すための "最良の" メソッドをカプセル化し、以下の表のように定義された typedef のコレクションで構成されます。の目的は、call_traits
「参照への参照」のような問題が発生しないようにすること、およびパラメーターが可能な限り最も効率的な方法で渡されることを保証することです。
コピーの省略とRVO(値による戻りの最適化)に関するこの記事「速度が必要ですか?値による渡し」を読むことができます。参照によってコンパイラーがそれらを実行できない場合があることを説明しています。
はい、参照引数で渡されるアクセスには、値引数で渡されるよりも多くのレベルの間接化が必要になる場合があります。また、引数のサイズが単一のポインターのサイズよりも小さい場合は、遅くなる可能性があります。もちろん、コンパイラが最適化していないと仮定しています。
型が参照/ポインターのサイズと同じか小さい場合、コンパイラーは、プリミティブ型を参照によって渡すことを単純に値によって渡すことを最適化できます。コンパイラがこれを行う保証はないため、選択肢がある場合は、プリミティブ型を値で渡します。ただし、テンプレート化されたコードでは、とにかく参照渡しする必要があることがよくあります- const 参照を取るベクトルの push_back を検討してください。int のベクトルがある場合は、プリミティブ型への参照を渡します。そのような状況では、コンパイラーが参照を値に置き換えることによってそれを最適化することを望みます。ただし、ベクターには大きな型が格納される可能性があるため、const 参照を受け入れることが最善の選択です。