64ビットプログラミングのポイント:64ビットコンピューティング最前線(1/3 ページ)
従来の32ビット環境に慣れてしまったプログラマがしばしば犯してしまうミスを交えつつ、32ビット環境から64ビット環境へ移行する際に注意すべき代表的なC言語のプログラミング例を紹介しよう。(特集:64ビットコンピューティング最前線)
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
64ビット環境へ移行する際の注意点
ここでは、従来の32ビット環境に慣れてしまったプログラマがしばしば犯してしまうミスを交えつつ、32ビット環境から64ビット環境へ移行する際に注意すべき代表的なC言語のプログラミング例を紹介します。
もちろん、32ビット環境でプログラムを書いたことのないプログラマにも有用な情報です。
ポインタをint型やlong型変数に代入しない
ポインタをint型やlong型変数に代入し、それを操作してはいけません。
アセンブラまたはインラインアセンブラを使った経験のあるプログラマは、C言語のポインタを整数型変数に代入してアドレスの計算を行うようなコードを書くことがあります。たとえば、List1のようなコードです。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このコードは、従来の32ビットプログラミングデータモデル上では正しく動作しますが、64ビットプログラミングデータモデル上ではポインタをint型にキャストしたとき、アドレスの上位ビットが失われてしまいセグメントフォルト[注2]などを引き起こしてしまう可能性があります。
また、C言語では、データ領域を動的に確保するためmalloc関数がよく用いられます。malloc関数の戻り値の型がvoid*であるという点に注意すれば、戻り値をint型で受け取ってはいけないということはすぐにわかるでしょう。このような関数では、必ずポインタ型を用いて受けるように注意してください。
64ビットのWindows環境では、新しいデータ型であるLONG_PTRなどを使うようにします。
long型とint型が混在した計算に気をつける
データモデルの違いによってlong型とint型の大きさが異なる場合があることに注意してください。
ILPやLLPのプログラミングデータモデルは、
sizeof(long) == sizeof(int)
ですが、64ビットプログラミングでの移植性をより高めたい場合は、この関係を仮定してはいけません。Table 6のとおり、LP64のプログラミングデータモデルが、
sizeof(long) != sizeof(int)
となっているからです。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
とくに、long型とint型が混在した演算では、中間結果をうっかりint型の変数に格納して上位ビットを欠落させてしまわないよう、十分に気をつける必要があります。
List2に型のデータサイズとデータモデルを表示するプログラムの例を示します。その実行結果をFig.2に示します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.