2006-12-03 (日)
*Visual C++ 2005
Express Editionでも一応,最適化は有効なので,どんなものか試してみる.
それにしても,アレですね.色々やっていると一から真っ当なコンパイラを書いてみたくなる(真っ当でないコンパイラなら何度か書きましたが…).プログラマなら,コンパイラとエディタは一度は書いてみたいものですね.
a = (a<<16) | (a>>16);
VC++2005はちゃんとrol命令を使ってくれます.
VC++6.0 mov ecx,eax shr ecx,10h shl eax,10h or ecx,eax VC++2005 rol ecx,10h
以前に,何でrol命令使ってくれないんだよ,と思いながらインラインアセンブラで書いた経験があったけど,もう大丈夫.
b = fact(4);
factは同じソース中にある階乗を計算する関数.(pushしてるのは,値が捨てられないように別の関数に渡すため)
VC++6.0 push 4 call 00401000 push eax VC++2005 push 18h
再帰でも非再帰でもfact(10)くらいまでは展開してくれます.ついでに再帰関数をfact(100)とかしても,非再帰のコードが出力されてます.
どうも,非再帰だとfact(10)までで,再帰を使うとfact(11)まで展開してくれる.再帰関数を非再帰関数に変換した時点で,ループの回数が一回少なくなっているようなので,それが原因っぽい.場合によっては再帰関数の方が速いコードが出来上がるのか.
c = sqrt(4.0);
まだ検証中.浮動小数点数の計算は定数に置き換えてくれない?
VC++6.0/VC++2005 fld qword ptr ds:[4090D0h] fsqrt VC++2005(?) fld qword ptr [__real@4010000000000000 (402148h)] call _CIsqrt (401AF0h)
あれ?fsqrt命令使わない場合がある?何でだろうか.常に使わないわけではなくて,場合によって使わないことがあるみたいです.