11

インライン関数がconst 参照で引数を渡すためにパフォーマンスが必要ですか?

foo(const T & a, const T &b)

値で比較

foo(T a, T b)

関数の a と b の値を変更しないとどうなりますか? C++11 の変更により、ここで具体的に何かが推奨されますか?

4

3 に答える 3

12

値渡しは、引数が一時的な場合にのみ、コピー コンストラクターの呼び出しを省略できます。

関数がインライン化されている場合、const 参照によってプリミティブ型を渡すことにはコストがかかりません。ただし、複雑な左辺値を値で渡すと、コストがかかる可能性のあるコピー コンストラクター呼び出しが発生します。そのため、const 参照で渡すことをお勧めします (エイリアシングが問題にならない場合)。

于 2011-10-02T16:47:55.090 に答える
4

理論的には、インライン関数がそれらを変更している可能性があるため (実際には変更されていなくても)、参照のないものはメモリにコピーされる可能性があります。

多くの場合、コンパイラはそのようなものを見つけるのに十分賢いですが、それはコンパイラと最適化設定に依存します。また、関数がクラス変数の非 const メンバー関数を呼び出す場合、コンパイラは、それらが何かを変更しているかどうかを確認するのに十分スマートでなければなりません。

const 参照を使用することで、基本的にかなり明確な指示を与えることができます。

編集: ddd で GCC 4.6 でコンパイルされた単純なテスト プログラムのマシン コードを確認します。生成されたコードは同じように見えたので、最適化されているようです。ただし、他のコンパイラにとっては、コードの意図を明確に示すものがない場合でも、これは良い習慣です。コンパイラが最適化できない、より複雑な状況が存在する可能性もあります。

また、llvm online dissembler demoは、同じビットコードがそこでも生成されることを示しています。最適化をオフにすると、const 参照なしで少し長くなります。
* 1964 バイト - const 参照なし (および関数/パラメーターの他の const なし)
* 1960 バイト - const 参照はなく、他の const。
* 1856 バイト - const および const 参照あり。

于 2011-10-02T14:16:39.843 に答える
1

参照渡しは、データ型によっては値渡しよりも高速です。
ただし、インライン関数の場合、関数本体 (および値で渡されるすべての参照) は、とにかく使用されるコード行に追加されるため、技術的には、渡される変数はなく、同じ領域にコード行が増えるだけです。

参照http://www.cprogramming.com/tutorial/lesson13.html

should-i-take-arguments-to-inline-functions-by-reference-or-valueという質問の下にも非常に役立つ回答があります

  • 例は誤解を招く可能性があり、削除されました -
于 2011-10-02T13:33:54.597 に答える