gcc-4.5 から link time optimization (lto) と呼ばれる最適化が可能になった。
従来の分割コンパイルでは、コンパイル単位(ファイル)での最適化しかできなかった。例えば、別ファイルの関数をインライン展開することはできないし、引数に渡されたポインタの escape analysis も諦めざるを得なかった。
lto はコンパイルする時に、中間表現(GIMPLEのバイトコード表現)をオブジェクトファイルに残しておき、リンクするときに、すべての中間表現を使って最適化しなおす。要は、ソースコードを全部とっておいて、最後に全部をコンパイルしなおすのと、同じようなものだ。
最大の欠点は、最後にコンパイルしなおすところだ。
このコンパイルは一回のコンパイルであり、単一プロセスで実装されているのでマルチCPUを生かせない。(いっぽう、分割コンパイルなら依存関係が緩いので並列化しやすい。)また、プログラム全体は巨大であり、最適化するのに時間がかかる。
使いかたは簡単だ。-fltoを付ければいい。
gcc-4.5 -c -O2 -flto foo.c
言語が相違なる場合でも最適化できるってこと?すごいね!