2006-12-03 (日)
2006年の更新履歴が何も無いのもアレなので,とりあえず何か更新しておくことに.
*更新::kwViewer
K-Viewerを更新しました.今回から名前がkwViewerに変わってます.
- 名前をK-ViewerからkwViewerに変更
- 前後のファイルに移動できるように(Alt+Left/Right)
- 大きい画像をウインドウ内に収める機能追加
- 前の画像が画面に残るバグ修正
- SPI読み込み失敗時に落ちるバグ修正
- 4の倍数以外のサイズで左回転が出来ないバグ修正
- ステータスバー表示
- VC++ 2005 Express Editionでコンパイルしてみるテスト
今回から VC++ 2005 でコンパイルしているので,Windows 95では動かないような気がしないでもないです.いまだに Windows 95 を使っている方はいないような気がしますが,いたらご連絡下さい.
*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命令使わない場合がある?何でだろうか.常に使わないわけではなくて,場合によって使わないことがあるみたいです.