質問: rand(); } }; struct Comp { bool operator()(const Foo& a, const Foo& b) const { return a.value > b.value; } } comp; int main() { std::vector a(100); std::sort(a.begin(), a.end(), comp); return 0; } ``` 上記の場合に、compを次のような関数に代えると ``` inline bool comp (const Foo& a, const Foo& b) { return a.value > b.value; } ``` の様に書き換えられます。functorで定義された関数はinline化の最適化がコンパイラで行われると聞きましたが、上記のように関数をinline宣言してしまえばfunctorとのパフォーマンスの差はなくなりますか?それとも他の最適化の要素があったりしますか?そもそもclassのmethodはinline化されるのがデフォですか? functorがfunctionと比べてもっと柔軟なコーディングができるのはわかりますが、パフォーマンスにおいてはコンパイラのに詳しくないのでどのような最適化が行われ、得になるのかがわかりません。 P.S. もし本当に functor にした場合のパフォーマンス上の恩恵が自動inline化だけであれば、簡単な関数をstructの定義を増やしながらfunctorを作る必要はないのではないでしょうか。ほとんどのstd::sortやstd::for_eachの例題は簡単な場合でもfunctorを作っており、一見、簡単な作業なのに、コードをややこしくしています。「簡単な作業ならinlineで定義した関数ポインター渡すだけでいいよ」と一言加えないのは、おそらく他の恩恵があるのではないか、と考えたからです。
回答: miteiさんは > > メンバ関数の実装本体をソースファイル(.cpp)に書くのではなくヘッダ(.h)に書いた場合は暗黙的に inline となります。 > > > と書かれていますが正確ではなく、クラス定義内に関数宣言でなく関数の定義も含めた場合、暗黙的にinlineが指定されます。クラス定義自体はヘッダファイルに書かれることが多いから誤解されているようです。もちろんヘッダファイルであってもクラス定義の外に関数を定義した場合はinlineの対象にはなりません。 C++にはinline関数や上記のようにクラス内に記述された暗黙的なinlineメンバー関数などが多数あるため従来のようにコンパイル時にオブジェクトファイルを生成し、リンク時に単に結合するだけでは効率が悪くなってしまうため、大抵のコンパイラーはリンカーと協調し、リンク時コード生成という機能があります。 これは関数のサイズや呼び出し関係から判断してインライン展開した方が効率の良さそうなものは自動的にインライン展開する機能です。当然ながらインライン化の判断基準にfunctorだからとかfunctionだからとかはありませんのでどちらもインライン展開される可能性はあります。