LP64は、主にSGIをはじめとするUNIX系の環境で採用される64ビットプログラミングデータモデルです。「I32LP64」と呼ばれることもあります。
LP64では、ポインタが64ビットになりますが、int型は従来どおり32ビットのままです。しかし、注意しなければならないのはlong型の扱いです。LP64のデータモデルでは、long型は64ビットになります。
LLP64は、Windows系の環境で用いられる64ビットプログラミングデータモデルです。「IL32P64」と呼ばれることもあります。
LLP64では、ポインタだけが64ビットになります。int型とlong型は32ビットのままです。64ビットの型を使う場合は、「__int64」など別途明示的に宣言されている型を使います。
なお、Windows環境については、のちほど新しく定義されたデータ型を紹介します。
ILP64は、ポインタもint型もlong型も、すべて64ビットとして扱われます。SGIはILP64の64ビットプログラミングデータモデルもサポートしていますが、どちらかというとLP64のほうを好んで使っているようです。
わかりやすいよう、3つのデータモデルをTable 5にまとめてみました。この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 |
Table 5 C/C++プログラミング言語における3つのデータモデル |
例えば、long型を32ビットとして扱っているようなC/C++のコードをLP64環境に持ってくる際はlong型に注意しなければなりませんし、その逆のケースも同じです。
このようなデータモデルの違いは、C/C++プログラミング言語に新しい基本的なデータ型を加えるというメカニズムがないために起こっています。64ビットシステムへの移行にあたり、C/C++アプリケーション開発者はスカラの(単一の)計算をする場合、既存のデータ型のマッピングを変えるか、または新しいデータ型を加える必要があります(64ビットへの移行にあたり、それまで「整数=32ビット」があたりまえと考えてしまっていたプログラマは、移植の際に自分のプログラムコードを再度見直す必要性が出てくるかもしれません)。
3つのうちのどのプログラミングデータモデルが優れているかというと、それぞれ一長一短があるので一概には答えられません。ただ、コンピュータの立場から考えると64ビットで統一されているILP64が、人間の立場から考えると従来の ILP32環境からほんの少しの変更が加えられたLLP64が、もっとも混乱の少なく扱いやすいといえるかもしれません。LP64は、これら両者のちょうど中間に位置するプログラミングデータモデルといえます。
ところで、ここまでご覧になってすでにお気づきかもしれませんが、各データモデルで使われている記号「I」「L」「P」の3つは、それぞれ「I=int型」「L=long型」「P=ポインタ」という意味です。ですから、例えば「I32LP64」であれば「I=32(ビット)で、LとP=64(ビット)」のデータモデルである、ということがわかります。C/C++では、この3つのデータ型にとくに気をつけなければなりません。
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.