c++の functor を使う場合の function とのパフォーマンスの差はinline化だけですか?
例えば次のような場合を考えます。
#include <unistd.h> // rand
#include <vector> // std::vector
#include <algorithm> // std::sort
struct Foo {
int key, value;
Foo() { // 適当
key = rand();
value = rand();
}
};
struct Comp {
bool operator()(const Foo& a, const Foo& b) const {
return a.value > b.value;
}
} comp;
int main() {
std::vector<Foo> 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で定義した関数ポインター渡すだけでいいよ」と一言加えないのは、おそらく他の恩恵があるのではないか、と考えたからです。