卒研をやっている頃に気づいたんですが、VC7.1には (VC7.0は不明) 従来からあった 「最大限の最適化 (/Ox)」 とは別に 「プログラム全体の最適化 (/GL & /LTCG) 」 というオプションスイッチが持てるようです。
解説を読んでみと…
/GL
・関数境界にまたがってレジスタの使用を最適化します。
・関数定義が別のモジュールにある場合でも、モジュールの関数をインライン展開できます。
/LTCG
・コンパイラを呼び出してプログラム全体の最適化を実行します。
まとめると 「コンパイル後リンクに入る時に、再度コンパイラを呼び出して、更に最適化しつつリンクしていく」 ちゅー、すごい事ができるようです!(たぶん)
実験してみたところ、たとえば…
//----- t00_00.cpp ------
int func(int n){ return n * 10; }
//----- t00_00.h -----
int func(int n);
//----- t00.cpp -----
#include "t00_00.h"
int main()
{
int n = func(10);
printf("%d", n);
return 0;
}
というような感じに、関数を別モジュールに分けたとしても、コンパイラの最適化により、単なる
int main()
{
printf("%d", 100);
return 0;
}
というコードに化けている事を確認しました!
中間ファイルを跨いでの最適化ってーのは、正直ビックリです。^^;
とりあえず、こんなオプションがあるってことでメモ。
※ちなみに、コンパイル時間が偉い長くなるので注意です。