[2182] Re:汎整数拡張について
投稿者:(ぱ)こと管理人
2019/08/11 01:20:26
『CプログラミングFAQ』は、持ってたはずなのですが、どこを探しても見当たらない……
>①汎整数拡張により、char型やshort型は、値を取り出す時に32ビットに変換されるので、
>int型より処理時間がかかったり、int型より実行ファイルが増大したりするのでしょうか?
この手の性能問題は私は全然詳しくないのですが(アプリケーションプログラマですので…)、
今時のCPUを相手に、どちらが良いとか悪いとかそう一概に言えるものではないと思っています。
たとえば先のchar_test.sとint_test.sをそれぞれGAS(GNU assembler)にかけてみると、
movsblの命令長はmovlよりも確かに長いのですが、int int_var = 5; の「5」が
32ビット幅になるので、結局のところ実効形式のサイズとしてはint_test.sの方が
微増しているようです。
char_test.s
17 0008 C645FF05 movb $5, -1(%rbp)
18 000c 0FBE45FF movsbl -1(%rbp), %eax
19 0010 89C6 movl %eax, %esi
int_test.s
17 0008 C745FC05 movl $5, -4(%rbp)
17 000000
18 000f 8B45FC movl -4(%rbp), %eax
19 0012 89C6 movl %eax, %esi
特に配列なら、主記憶は十分にあっても、今時キャッシュに乗らないと性能は出ないので、
小さな型を使った方が早いケースはあるかもしれません。
配列でないなら、どちらにしても、そう大差があるとは思えませんが。
>②汎整数拡張があるので、char型やshort型を使わずに、int型を使った方が良いのでしょうか?
配列でないスカラの変数であれば、たとえば1バイト文字しか入らないとわかっていても、
私ならintを使います。「ポインタ完全制覇」にも書きましたが、getchar()の
戻り値やputchar()の引数も、実際intですし。