いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

C++コード超最適化オプション

卒研をやっている頃に気づいたんですが、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;
}

というコードに化けている事を確認しました!
中間ファイルを跨いでの最適化ってーのは、正直ビックリです。^^;

とりあえず、こんなオプションがあるってことでメモ。
※ちなみに、コンパイル時間が偉い長くなるので注意です。