理由を説明します 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_t16ビット幅でレジスタに収まる可能性があります。そして、誰がどんな種類のオペレーティングシステムが将来書かれるかを知っていましたか?理論的には、i386アーキテクチャは、オペレーティングシステムが実際に使用したことがない48ビットポインターを備えた32ビットセグメンテーションモデルを提供します。
メモリオフセットの種類は、longレガシコードがlong32ビット幅であると想定しすぎているため、考えられません。この仮定は、UNIXおよびWindows APIにも組み込まれています。残念ながら、他の多くのレガシーコードもlong、ポインタ、ファイルオフセット、1970年から経過した秒数などを保持するのに十分な幅があると想定していました。POSIXは、前者の代わりに後者の仮定が真になるように強制する標準化された方法を提供しますが、どちらも移植可能な仮定ではありません。
int90年代のごく一部のコンパイラだけがint64ビット幅にしたからではありません。次に、long32ビット幅を維持することによって、彼らは本当に奇妙なことになりました。規格の次の改訂では、がintより広いことは違法であると宣言されましたが、ほとんどの64ビットシステムでは32ビット幅のままです。longint
それはあることができなかったlong long intことがあっても、32ビットシステムで広い少なくとも64ビットであるために作成されたので、とにかく後添加しました。
したがって、新しいタイプが必要でした。そうでない場合でも、他のすべてのタイプは、配列またはオブジェクト内のオフセット以外のものを意味していました。また、32ビットから64ビットへの移行の大失敗から1つの教訓があった場合、型に必要なプロパティを具体的に示し、異なるプログラムで異なることを意味するプロパティを使用しないでください。
int、some_size署名されている場合は署名されている場合に使用しますsize_t。