モダンなコンパイラは、バイナリサイズとか関数のサイズがでかく成りすぎない様に上手くインライン化してくれる。
それでも、コンパイラは何もかもを知っているわけでは無いので、時々誤った判断をする。
例えば、非常に頻繁に呼ばれるある関数fがある。
つまり、この関数fのほんの少しのコストの増大も、全体としては大きなコストになる。
しかし、コンパイラはそんな事は知らない。
fの中の非常に稀に呼ばれるコードパスの中に大きなスタックフレーム(といっても256byteとかそんくらい)を生成する関数gがある。
また、関数gはこのコードパスでしか呼ばれない。
gは稀にしか呼ばれないので、インライン化しても大してメリットは無いが、コンパイラはgが稀にしか呼ばれないなど分からない。
そのため、コンパイラはgの呼び出しはインライン化してしまう事がある。
Linuxのカーネル内では、この様な誤った最適化を防ぐために、noinlineキーワードを多用しているらしい。
また、最近のコンパイラは、スタックフレームの一部の生成を必要になるまで遅延させるコードを吐けるらしい。