以下のメッセージを削除します。


[2182] Re:汎整数拡張について
返信


投稿者:(ぱ)こと管理人
2019/08/11 01:20:26

Link:
『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ですし。

パスワード:

管理者削除