64ビットになると何が変わる?――64ビットプログラミングのデータモデル64ビットコンピューティング最前線(2/2 ページ)

» 2005年06月13日 00時00分 公開
[C MAGAZINE]
前のページへ 1|2       

LP64

 LP64は、主にSGIをはじめとするUNIX系の環境で採用される64ビットプログラミングデータモデルです。「I32LP64」と呼ばれることもあります。

 LP64では、ポインタが64ビットになりますが、int型は従来どおり32ビットのままです。しかし、注意しなければならないのはlong型の扱いです。LP64のデータモデルでは、long型は64ビットになります。

LLP64

 LLP64は、Windows系の環境で用いられる64ビットプログラミングデータモデルです。「IL32P64」と呼ばれることもあります。

 LLP64では、ポインタだけが64ビットになります。int型とlong型は32ビットのままです。64ビットの型を使う場合は、「__int64」など別途明示的に宣言されている型を使います。

 なお、Windows環境については、のちほど新しく定義されたデータ型を紹介します。

ILP64

 ILP64は、ポインタもint型もlong型も、すべて64ビットとして扱われます。SGIはILP64の64ビットプログラミングデータモデルもサポートしていますが、どちらかというとLP64のほうを好んで使っているようです。

データモデルの相違に注意

 わかりやすいよう、3つのデータモデルをTable 5にまとめてみました。この3つのデータモデルを比較すると一目瞭然なのですが、それぞれのシステム向けに別のコンパイラを用いてリコンパイルする場合は、整数データの型に注意しなければなりません。

Table 5 C/C++プログラミング言語における3つのデータモデル
データモデル システム char型
(ビット)
short型
(ビット)
int型
(ビット)
long型
(ビット)
ポインタ
(ビット)
LLP64(IL32P64) Win64 8 16 32 32 64
LP64(I32LP64) UNIX系 8 16 32 64 64
ILP64 UNIX系 8 16 64 64 64

 たとえば、long型を32ビットとして扱っているようなC/C++のコードをLP64環境に持ってくる際はlong型に注意しなければなりませんし、その逆のケースも同じです。

 このようなデータモデルの違いは、C/C++プログラミング言語に新しい基本的なデータ型を加えるというメカニズムがないために起こっています。64ビットシステムへの移行にあたり、C/C++アプリケーション開発者はスカラの(単一の)計算をする場合、既存のデータ型のマッピングを変えるか、または新しいデータ型を加える必要があります(64ビットへの移行にあたり、それまで「整数=32ビット」があたりまえと考えてしまっていたプログラマは、移植の際に自分のプログラムコードを再度見直す必要性が出てくるかもしれません)。

 3つのうちのどのプログラミングデータモデルが優れているかというと、それぞれ一長一短があるので一概には答えられません。ただ、コンピュータの立場から考えると64ビットで統一されているILP64が、人間の立場から考えると従来の ILP32環境からほんの少しの変更が加えられたLLP64が、もっとも混乱の少なく扱いやすいといえるかもしれません。LP64は、これら両者のちょうど中間に位置するプログラミングデータモデルといえます。

Tips 4 データモデルを表す記号
  ところで、ここまでご覧になってすでにお気づきかもしれませんが、各データモデルで使われている記号「I」「L」「P」の3つは、それぞれ「I=int型」「L=long型」「P=ポインタ」という意味です。ですから、たとえば「I32LP64」であれば「I=32(ビット)で、LとP=64(ビット)」のデータモデルである、ということがわかります。
  C/C++では、この3つのデータ型にとくに気をつけなければなりません。

前のページへ 1|2       

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.

注目のテーマ