64ビットプログラミングのポイント:64ビットコンピューティング最前線(3/3 ページ)
従来の32ビット環境に慣れてしまったプログラマがしばしば犯してしまうミスを交えつつ、32ビット環境から64ビット環境へ移行する際に注意すべき代表的なC言語のプログラミング例を紹介しよう。(特集:64ビットコンピューティング最前線)
アライメント(Alignment)に気をつける
多くのコンピュータは、アドレスの最下位ビットが「1」となる場所を先頭アドレスとして、2バイトの変数をメモリに格納することはできません(最悪の場合、環境によってはアプリケーションがクラッシュしてしまいます)。もし、格納できるとしても、メモリのアクセス効率が極端に悪くなってしまうので、通常は最下位ビットが「0」となるアドレスに変数領域を割り当てるようコンパイラが最適化します。
同様に、4バイトの変数は下位ビットが「01」「10」「11」となる場所には格納できず、「00」となる場所に配置されます。このようにメモリ上でデータの境界がそろえられることを「アライメント(Alignment)」と呼びます。
たとえば、List6のような構造体があったとします。また、この構造体cellはメモリ上の0x12345670番地に置かれているものと仮定します。そうすると、構造体のメンバ変数val_cは、0x12345670に置かれます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
32ビットのコンピュータでILP32の場合、メンバ変数val_pの長さは4バイトです。しかし、アライメントの影響によって、val_pはval_cに続く領域「0x12345671〜0x12345674」には置くことができず、4バイト境界の「0x12345674〜0x12345677」に置かれることになります。すなわち、val_cとval_pはFig.3の上の図のように、ちょうど4バイト離れた場所に配置されます。
それに対し64ビット環境では、val_pが8バイトなので8バイト境界に置かれることが多く、先のコードを64ビットの境界でコンパイルすると、val_cとval_pは通常8バイト離れます(Fig. 3の下の図)。したがって、両変数の間隔を「何バイト」と決めつけているようなプログラムは、それぞれの環境でうまく動いてくれないことになります[注3]。なお、構造体のアライメントはコンパイラのオプションで変更できる場合があります。しかし、プログラムのパフォーマンスやポータビリティを高めるためには、できるだけアライメントの影響を受けないような構造体の配列にしておくことが望ましいといえます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
関連記事
- 特集:64ビットコンピューティング最前線
- あなたホントに64ビットを説明できますか?
- 64ビットへの移行で懸念される問題――基礎編
- 64ビット対応プロセッサを3分で理解する
- 64ビットになると何が変わる?――64ビットプログラミングのデータモデル
関連リンク
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.