2009年07月09日

閑話休題その2 64ビットCPU対応プログラミング

現在主流になっているCPUは、32/64bit両方に対応しているものが
多いと思います。
今後OSで、64bitCPU対応のものが主流になれば、自ずと32bitCPUは
廃れていくことになるでしょう。
Windowsのコンシューマ版でも、XPより64bit版が登場し、
WindowsVistaやWindows7でも32bit版、64bit版両方のバージョンが
発売されています。
今後、64bitCPUへの対応が避けては通れないものになるでしょう。
ここでは、64bitCPUに対応する上での注意点を挙げていきたいと思います。

そもそも32bitや64bitとは何を指しているのでしょうか?
これを説明するためには、CPUがどういった構造になっているのか
理解する必要があります。

CPUとは、Central Processing Unit(中央演算処理装置)の略で、
PCで発生する演算の一手を担います。

cpu_image.jpg

PCは、全てバイナリの命令群によって制御されています。
バイナリの命令は全てメモリに配置され、逐次的に実行しています。
バイナリにはそれぞれ番号に意味があり、インテルCPUでは
例えば加算を意味するADDは、0x04と定義され、
その後に加算する値が続きます。
上の図の例では、メモリの最初のアドレスで、0x04ときているので、
CPUは加算命令と判断します。
次の0x54をみて、実際に0x54を加算します。

このとき、CPUはレジスタという一時領域に計算結果を保存し
次の計算へとつなげます。
32bitCPUは、このレジスタのサイズが32bitで、
64bitCPUは、レジスタのサイズが64bitになります。

また、現在実行している命令の場所もレジスタに保存されます。
32bitCPUの時に、メモリが3GBちょいしか積めないという
問題の発端はここからきています。

これは、一度に(1命令で)計算できる幅が32bitに
限定されているということです。
仮に32bitのCPUで64bit同士の値の計算を行う場合、
まず、下位桁を計算し、次に上位桁を計算するといった
ことを行い、結果を出します。
64bitの方が高速と言われる理由は、この部分で、
64bit同士の計算が1命令で済んでしまうわけです。

ここまでは、アセンブラや機械語の話で、
C言語などの高級言語に置き換えると次のような影響をうけます。
32bitから64bitに移行した場合の、影響です。
@int型やlong型が32bitから64bitに拡張される(場合がある)
Aポインタが64bitに拡張される(場合がある)
B0xFFFFFFFFが[-1]にならない
Cアライメントが4バイトから8バイトに拡張される
DWin32APIなどの関数の一部で32bit対応のものと64bit対応のものを変更する
Eアセンブラのレジスタ、命令を書き換える

厳密にC言語の仕様を踏襲している人なら、
@などは問題にならないかと思いますが、
案外軽視しがちなのが、A〜Cあたりだと思います。
Aなどは、ポインタをintに代入するプログラムなどが
動かなくなる可能性があります。

ちなみにDは具体的には次の関数に影響がでます。
@SetWindowLong() → SetWindowLongPtr()
AGetWindowLong() → GetWindowLongPtr()


以上のことを考慮にいれてプログラムする必要があります。


ラベル:ふわ猫
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。