関数オブジェクト
C++ における関数オブジェクトの利点のひとつは、関数ポインタと異なり、インライン化できるためパフォーマンスが良い点である。たとえば、引数をインクリメントさせるシンプルな関数は関数オブジェクトとして実装できる:
通常の関数:
STL 関数 std::for_each() を用いると下記のようになる:
ここに std::for_each() を適用すると下記のようになる:
いずれの for_each()も期待通りの動作をするが、最初の方法では以下のように展開される。
二番目の方法では以下のように展開される。
for_each<int*, IncrementFunctor>()の場合には関数が既知であるためコンパイラがインライン化できるが、for_each<int*, void(*)(int&)>() の場合にはコンパイル時に関数が不定でありインライン化できない。
現実には、コンパイラに指示すれば簡単に関数を既知にすることができる。