|
printf("%g\n", sqrt(2.0f)); // <math.h> <stdio.h> あり、に対して // これがいいテストでないのは百も承知
i686-pc-cygwin-gcc-4.5.3 とか hppa2.0w-hp-hpux11.11-gcc-4.8.2 だと 最適化オプションに関係なく (-O0 と -O9 の両方で) 浮動小数点数リテラルを引数に取る sqrt() はコンパイル時評価され 生成される機械語上では sqrt(2.0f) が double 浮動小数点数定数値に展開された。 gcc -S -O9 sqrtest.c とか
VC++2005 では -Od で最適化を禁ずると浮動小数点数引数をスタックに積む形式のライブラリ関数 _sqrt を呼び出す -Ox で最適化をかけると浮動小数点数引数を FP に積む形式のライブラリ関数 __CIsqrt を呼び出す つまりコンパイル時に定数展開する処理はしていない。 cl -Ox -FAsc sqrtest.c とか
某社の某組み込みマイコン向けCコンパイラは定数展開しなかった(詳細略)
Console.WriteLine(Math.Sqrt(2.0)); // に対して VC#2005 では csc /o+ および csc /o- の両方でコンパイル時展開を行わない。 (ildasm で確認) csc -o+ sqrtest.cs とか。
ってことで VS2010 でどうなっているかは自分で確認してみるといい。
|