理由を説明します size_t
存在する必要があったと、ここに到達する方法について説明します。
実用的な面では、size_t
とptrdiff_t
は、64ビット実装では64ビット幅、32ビット実装では32ビット幅が保証されています。従来のコードを壊さずに、すべてのコンパイラで既存の型を強制することはできませんでした。
A size_t
又はptrdiff_t
必ずしも同じではないintptr_t
、またはuintptr_t
。彼らはまだ使用中だったときに、特定のアーキテクチャ上で異なっていたsize_t
とptrdiff_t
(例えば16ビットWindowsなど)80年代後半には、標準に加え、C99は、多くの新しいタイプを追加したときに時代遅れになってきて、まだ行っていません。16ビットプロテクトモードのx86にはセグメント化されたメモリがあり、可能な最大の配列または構造は65,536バイトのサイズしかありませんでしたが、far
ポインターは32ビット幅で、レジスターよりも広い必要がありました。それらについてintptr_t
は、32ビット幅でしたがsize_t
、ptrdiff_t
16ビット幅でレジスタに収まる可能性があります。そして、誰がどんな種類のオペレーティングシステムが将来書かれるかを知っていましたか?理論的には、i386アーキテクチャは、オペレーティングシステムが実際に使用したことがない48ビットポインターを備えた32ビットセグメンテーションモデルを提供します。
メモリオフセットの種類は、long
レガシコードがlong
32ビット幅であると想定しすぎているため、考えられません。この仮定は、UNIXおよびWindows APIにも組み込まれています。残念ながら、他の多くのレガシーコードもlong
、ポインタ、ファイルオフセット、1970年から経過した秒数などを保持するのに十分な幅があると想定していました。POSIXは、前者の代わりに後者の仮定が真になるように強制する標準化された方法を提供しますが、どちらも移植可能な仮定ではありません。
int
90年代のごく一部のコンパイラだけがint
64ビット幅にしたからではありません。次に、long
32ビット幅を維持することによって、彼らは本当に奇妙なことになりました。規格の次の改訂では、がint
より広いことは違法であると宣言されましたが、ほとんどの64ビットシステムでは32ビット幅のままです。long
int
それはあることができなかったlong long int
ことがあっても、32ビットシステムで広い少なくとも64ビットであるために作成されたので、とにかく後添加しました。
したがって、新しいタイプが必要でした。そうでない場合でも、他のすべてのタイプは、配列またはオブジェクト内のオフセット以外のものを意味していました。また、32ビットから64ビットへの移行の大失敗から1つの教訓があった場合、型に必要なプロパティを具体的に示し、異なるプログラムで異なることを意味するプロパティを使用しないでください。
int
、some_size
署名されている場合は署名されている場合に使用しますsize_t
。