unsigned int と size_t

size_t type は、sizeof の結果である符号なし整数型です。 演算子 (および offsetof そのため、システムが処理できる最大のオブジェクトのサイズを格納するのに十分な大きさであることが保証されています (例:8Gb の静的配列)。

size_t 型は unsigned int より大きい、等しい、または小さいかもしれません 、コンパイラは最適化のためにそれについて仮定する場合があります。

より正確な情報は、C99 標準のセクション 7.17 (そのドラフトはインターネットで PDF 形式で入手可能)、または C11 標準のセクション 7.19 (PDF ドラフトとしても入手可能) で見つけることができます。


Classic C (Brian Kernighan と Dennis Ritchie が The C Programming Language、Prentice-Hall、1978 で説明した C の初期の方言) は size_t を提供しませんでした。 . C 標準委員会は size_t を導入しました 移植性の問題を解消する

embedded.com で詳しく説明されています(非常に良い例を使用)


要するに、size_t 負になることはなく、パフォーマンスを最大化します。これは、ターゲット プラットフォームで可能な最大のオブジェクトのサイズを表すのに十分な大きさ (ただし大きすぎない) の符号なし整数型になるように typedef されているためです。

サイズは決して負であってはならず、実際には size_t 符号なしタイプです。また、 size_t なので 符号なし整数の他のすべてのビットと同様に、符号ビットを使用して大きさを表すことができるため、対応する符号付き型の約 2 倍の大きさの数値を格納できます。もう 1 ビット増えると、表現できる数値の範囲が約 2 倍になります。

unsigned int を使用しない理由 ?十分な数を保持できない場合があります。 unsigned int の実装では は 32 ビットで、表現できる最大数は 4294967295 です . IP16L32 などの一部のプロセッサは、4294967295 より大きいオブジェクトをコピーできます。 バイト。

では、unsigned long int を使用してみませんか? ?一部のプラットフォームでは、パフォーマンスが大幅に低下します。標準 C では、long 少なくとも 32 ビットを占有します。 IP16L32 プラットフォームは、各 32 ビット長を 16 ビット ワードのペアとして実装します。これらのプラットフォームのほぼすべての 32 ビット オペレータは、2 つの 16 ビット チャンクで 32 ビットを処理するため、少なくとも 2 つの命令を必要とします。たとえば、32 ビットの長さを移動するには、通常、2 つのマシン命令が必要です。16 ビットのチャンクごとに 1 つです。

size_t の使用 このパフォーマンスの犠牲を回避します。この素晴らしい記事によると、「タイプ size_t 通常は unsigned int の符号なし整数型のエイリアスである typedef です。 または unsigned long 、しかしおそらく unsigned long long .標準 C の各実装では、ターゲット プラットフォームで可能な最大のオブジェクトのサイズを表すのに十分な大きさ (必要以上に大きくない) の符号なし整数を選択することになっています。"