コンパイラーがインライン化できるものの誤解を解消するために、十分に優れたコンパイラーは関数ポインターをインライン化できます。利用可能な静的情報が多いため、関数オブジェクトをより簡単にインライン化できます。たとえば、パラメータを受け取らずにboolを返す関数へのポインタはbool(*)()型ですが、functorは明示的な型、つまりfunctorを持ち、テンプレートのインスタンス化は静的にfunctor演算子を呼び出すことができます。関数ポインタを介して呼び出す必要があるよりも。
ただし、実際には、これは主に、効果的に最適化するのに十分な情報をコンパイラーに提供することです。
たとえば、完全に最適化された次のコードがある場合、Visual C++2008は次のようになります。
#include "stdafx.h"
#include <algorithm>
const char print_me[]= "hello!";
class print_functor
{
public:
void operator()(char c)
{
printf("%c", c);
}
};
void print_function(char c)
{
printf("%c", c);
}
int _tmain(int argc, _TCHAR* argv[])
{
std::for_each(print_me, print_me + sizeof(print_me)/sizeof(print_me[0]), print_functor());
printf("\n");
std::for_each(print_me, print_me + sizeof(print_me)/sizeof(print_me[0]), print_function);
return 0;
}
std::for_each
両方の呼び出しを完全にインライン化します。ちなみに、PCでは最初のfor_eachに不要ながありlea ecx, [ecx]
ます。