『float』の『++』や『--』って…
C言語のお話である…。
自分は、『float』で『++』や『--』って、
使えないと思い込んでいた節がある…。
基本的には、
> float f;
> f +=1;
> f -=1;
こう書いていた。
所が最近こう書けることを知った。
> float f;
> f++;
> f--;
最初は、0.1とか足される?引かれる?
なんて思ったりした。
でも、ちゃんと1の増減だったりする。
マシン語だと1の増減は、スペシャルな命令があり
『Z80/8080』系だと『inc』や『dec』などがそれに当たる。
他にも『MC68000』などは、『ADDQ』や『SUBQ』などがある。
何がスペシャルかと言うと他の命令より格段に高速に実行される。
なので『int』での1の増減は『inc』や『dec』かと思っていた。
でも、『float』は、データ構造が異なるのでどおなのかな?
と思って見てみた…。
>void main( void )
>{
> int a;
> float ff;
> ff=0;
> ff++;
> ff--;
> a=0;
> a++;
> a--;
>}
をデバッガ上で見てみるとこうなっていた…。
4: void main( void )
5: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,48h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-48h]
0040101C mov ecx,12h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
6: int a;
7: float ff;
8: ff=0;
00401028 mov dword ptr [ebp-8],0
9: ff++;
0040102F fld dword ptr [ebp-8]
00401032 fadd dword ptr [__real@4@3fff8000000000000000 (0042601c)]
00401038 fst dword ptr [ebp-8]
10: ff--;
0040103B fsub dword ptr [__real@4@3fff8000000000000000 (0042601c)]
00401041 fstp dword ptr [ebp-8]
11: a=0;
00401044 mov dword ptr [ebp-4],0
12: a++;
0040104B mov eax,dword ptr [ebp-4]
0040104E add eax,1
00401051 mov dword ptr [ebp-4],eax
13: a--;
00401054 mov ecx,dword ptr [ebp-4]
00401057 sub ecx,1
0040105A mov dword ptr [ebp-4],ecx
14: }
0040105D pop edi
0040105E pop esi
0040105F pop ebx
00401060 mov esp,ebp
00401062 pop ebp
00401063 ret
やっぱ表記は、『f++;』でも中身では、『f+=1;』なんだ…。
でも、『a++;』も中身は、『a+=1;』だったので吃驚!
『int』の増減も『add』や『sub』ってのは、
条件分けで『inc』や『dec』を噛ませるのが
コストパフォーマンス的に意味が無いからかも…。
確かメモリにダイレクトに『inc』は、駄目だったかと…
うろ覚えなので『はじめて読む486』を開く。
するとメモリダイレクトでもOKだ…。
じゃあ、もう『inc』をわざわざ使うメリットが無いんだろうな…。
そんな瑣末な命令速度差なんか
メモリーアクセスで吹き飛ぶんだろうな。
…
昔は、『add a,1』より『inc a』の方が早い!
なんてのに血道を注いでいたのに…
なんて…
何となく手がかじかむ寒さの中で思ってみた…。
| 固定リンク
コメント