コンパイラ/プラットフォームが持つことができる最大のオブジェクトが 4 GB だとしましょう。size_t
次に32ビットです。ここで、サイズ 2^43 - 1 のオブジェクトをサポートできる 64 ビット プラットフォームでプログラムを再コンパイルするとします。size_t
少なくとも 43 ビットの長さになります (ただし、通常、この時点では 64 ビットになります)。ポイントは、プログラムを再コンパイルするだけでよいということです。int
すべての をlong
( int
32 ビットでlong
64 ビットの場合) または からint32_t
に変更する必要はありませんint64_t
。(なぜ 43 ビットなのか自問自答している場合は、Windows Server 2008 R2 64 ビットがサイズ 2^63 のオブジェクトもサイズ 2^62 のオブジェクトもサポートしていないとしましょう... 8 TBのアドレス可能スペースをサポートしています...つまり 43少し!)
DWORD
Windows 用に作成された多くのプログラムでは、ポインターは(32 ビットの符号なし整数)と同じ大きさであると見なされていました。これらのプログラムは、大量のコードを書き直さない限り、64 ビットで再コンパイルすることはできません。DWORD_PTR
彼らが(ポインターを含むために必要なだけ大きいことが保証されている符号なしの値)を使用していれば、この問題は発生しなかったでしょう。
「size_t
ポイント」も同様です。しかし違う!
size_t
ポインターを含むことができるとは限りません!!
(DWORD_PTR
Microsoft Windowsのは)
これは、一般に違法です。
void *p = ...
size_t p2 = (size_t)p;
たとえば、古い DOS「プラットフォーム」では、オブジェクトの最大サイズは 64k であったため、16 ビットである必要size_t
がありましたが、ファー ポインターは少なくとも 20 ビットである必要がありました。これは、8086 のメモリ空間が 1 MB ( 8086 のメモリがセグメント化されていたため、far ポインタの最後は 16 + 16 ビットでした)