質問

C ++での価値のある価値よりもパスバイレファレンスが高価であるケースはありますか?もしそうなら、そのケースは何でしょうか?

役に立ちましたか?

解決

プリミティブタイプ(int、char、float、...)と、値でコピーするのが安価な(ポイント、複雑)の操作を渡すことを好みます。

これは、参照を通過するときに必要な間接よりも効率的です。

見る ブーストの呼び出し特性.

テンプレートクラス call_traits<T> 関数との間のタイプtのパラメーターを渡す「最良の」メソッドをカプセル化し、以下の表のように定義されたtypedefのコレクションで構成されています。の目的 call_traits 「参照への参照」などの問題が発生せず、パラメーターが可能な限り最も効率的な方法で渡されるようにすることです。

他のヒント

この記事を読むことができます 「スピードが欲しい?価値を通過する」 コピーエリジョンとRVOについて(価値最適化による返却)。参考文献は、コンパイラがそれらを行うことを妨げることがあると説明しています。

はい、参照によって渡されたものにアクセスするには、価値引数による渡されたよりも多くの間接的なレベルが必要になる場合があります。また、引数のサイズが単一のポインターのサイズよりも小さい場合、より遅くなることがあります。もちろん、コンパイラが最適化されていないと仮定しています。

このタイプが参照/ポインターのサイズと同じサイズまたは小さい場合、単に値を通過するために、参照によってプリミティブタイプを最適化することができます。コンパイラがこれを行う保証はありませんので、選択肢がある場合は、プリミティブタイプを価値で渡してください。ただし、テンプレートコードでは、とにかく参照で渡す必要があることがよくあります - constリファレンスを取るVectorのpush_backを検討してください。 INTのベクトルがある場合、原始タイプへの参照を渡すことになります。そのような状況では、参照を値に置き換えることにより、コンパイラがそれを最適化することを願っています。ただし、ベクトルは大きなタイプを保存している可能性があるため、const参照を受け入れることが最良の選択です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top