プラットフォームによって異なります。Mac OS X では、64 ビット プロセスのアドレス空間の最初の 4 GB が予約され、マップされていません。これは、おそらく安全機能として、 32 ビット値がポインターと間違えられることがないようにするためです。試してみれば、これを打ち負かす方法があるかもしれません。格納された値に 0x100000000 を追加する C++ の「ポインター」クラスを作成することで、一度回避しました。(これは、配列へのインデックス付けよりも大幅に高速でした。これには、配列ベースのアドレスを見つけて、加算の前に乗算することも必要です。)
ISA レベルでは、32 ビット値を読み込んでゼロ拡張し、それを 64 ビット ポインターとして使用することを確実に選択できます。これは、プラットフォームが持つべき優れた機能です。
64 ビット ポインターと 32 ビット ポインターを同時に使用する場合を除き、プログラムを変更する必要はありません。near
その場合、far
ポインタを持っていた古き良き時代に戻っています。
また、ポインターへのポインターを使用する API との ABI の互換性が確実に失われます。