次のような単純な関数を考えてみましょう:
int SimpleFunc (const int X, const int Y)
{
return (X + 3 * Y);
}
int main(int argc, char* argv[])
{
int Test = SimpleFunc(11, 12);
return 0;
}
これは、次のコードに変換されます (MSVC++ v6、デバッグ)。
10: int SimpleFunc (const int X, const int Y)
11: {
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,40h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-40h]
0040102C mov ecx,10h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
12: return (X + 3 * Y);
00401038 mov eax,dword ptr [ebp+0Ch]
0040103B imul eax,eax,3
0040103E mov ecx,dword ptr [ebp+8]
00401041 add eax,ecx
13: }
00401043 pop edi
00401044 pop esi
00401045 pop ebx
00401046 mov esp,ebp
00401048 pop ebp
00401049 ret
関数本体には 4 つの命令しかありませんが、関数自体を呼び出すための別の 3 つの命令を含まず、関数のオーバーヘッドだけに 15 の命令があることがわかります。すべての命令に同じ時間がかかった場合 (そうではない場合)、このコードの 80% は関数のオーバーヘッドです。
このような単純な関数の場合、関数のオーバーヘッド コードの実行に、メインの関数本体自体と同じくらいの時間がかかる可能性が高くなります。深いループ本体で数百万回/数十億回呼び出される単純な関数がある場合、関数呼び出しのオーバーヘッドが大きくなり始めます。
いつものように、重要なのは、特定の関数をインライン化することで正味のパフォーマンスが向上するかどうかを判断するためのプロファイリング/測定です。「頻繁に」呼び出されないより「複雑な」関数の場合、インライン化によるメリットは計り知れないほど小さい可能性があります。