私はsize_t
についてとても混乱しています。インターネットで検索したところ、size_t
は符号なしの型であるため、負でない値のみを表すことができると述べました。
私の最初の質問は、負でない値のみを表すために使用される場合、unsigned int
の代わりにsize_t
を使用しないのですか?
2番目の質問は、size_t
とunsigned int
は交換可能かどうかです。そうでない場合、なぜですか?
size_t
とその動作の簡単な例を教えてください。
負でない値を表すために使用される場合、
unsigned int
の代わりにsize_t
を使用しない理由
unsigned int
が唯一の符号なし整数型ではないためです。 size_t
は、実装に応じて、unsigned char
、unsigned short
、unsigned int
、unsigned long
、またはunsigned long long
のいずれかになります。
2番目の質問は、
size_t
とunsigned int
は互換性があるかどうかであり、そうでない場合はなぜですか?
上記の^^
で説明した理由により、これらは互換性がありません。
そして、誰でもsize_tとその簡単な動作の良い例を教えてもらえますか?
私はあなたが「簡単な働き」で何を意味するのかよくわかりません。これは、他の符号なし型と同様に機能します(特に、型定義された型のように)。オブジェクトのサイズを記述するときは、size_t
を使用することをお勧めします。特に、sizeof
演算子およびstrlen()
などのさまざまな標準ライブラリ関数は、size_t
を返します。
ボーナス: これは良い記事ですsize_t
(および密接に関連するptrdiff_t
タイプ)について。それを使用する理由は非常によくわかります。
Cには5つの標準の符号なし整数型があります。
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
サイズと範囲にさまざまな要件があります(簡単に言うと、各タイプの範囲は次のタイプの範囲のサブセットですが、一部の範囲は同じ範囲になっている場合があります)。
size_t
は、いくつかの符号なしの型のtypedef
(つまりエイリアス)です(おそらく上記のいずれかですが、おそらく拡張符号なし整数型ですが、そうではありません)。これは、sizeof
演算子によって生成される型です。
1つのシステムでは、unsigned int
を使用してサイズを表すのが理にかなっている場合があります。別の場合、unsigned long
またはunsigned long long
を使用する方が理にかなっている場合があります。 (size_t
がunsigned char
またはunsigned short
になることはほとんどありませんが、許可されています)。
size_t
の目的は、サイズを表すために事前定義されたタイプのwhichが使用されることを心配することからプログラマーを解放することです。
sizeof
がunsigned int
を生成することを前提とするコードは移植できません。 size_t
を生成することを前提とするコードは、移植性が高くなります。
size_t
には特定の制限があります。
http://www.cplusplus.com/reference/cstring/size_t/ からの引用:
基本的な符号なし整数型のいずれかのエイリアス。
これは、オブジェクトのサイズをバイト単位で表すことができるタイプです:size_tは、sizeof演算子によって返されるタイプであり、標準ライブラリで広く使用されていますサイズとカウントを表すため。
int
のサイズはデータモデルで指定されているため、unsigned int
と交換できません。たとえば、LLP64は32ビットint
を使用し、ILP64は64ビットint
を使用します。
size_tは、データオブジェクトのサイズを格納するために使用され、特定のC実装が作成できるデータオブジェクトのサイズを保持できることが保証されています。このデータ型は、小さい(ビット数)、大きい、またはunsigned intとまったく同じです。
他の回答とは別に、コードを文書化し、メモリ内のオブジェクトのサイズについて話していることを人々に伝えます
size_t型は、C/C++言語の基本的な符号なし整数型です。これは、sizeof演算子によって返される結果のタイプです。タイプのサイズは、任意のタイプの理論的に可能な配列の最大サイズを格納できるように選択されます。 32ビットシステムでは、size_tは32ビット、64ビットでは64ビットになります。つまり、size_t型の変数は安全にポインターを格納できます。例外はクラス関数へのポインターですが、これは特別な場合です。 size_tはポインターを格納できますが、その目的には別の符号なし整数型uintptr_tを使用することをお勧めします(名前にはその機能が反映されています)。タイプsize_tおよびuintptr_tは同義語です。 size_t型は通常、ループカウンター、配列のインデックス付け、およびアドレス演算に使用されます。 size_t型の可能な最大値は定数SIZE_MAXです。
簡単に言えば、size_tはプラットフォームに依存し、実装にも依存しますが、unsigned intはプラットフォームにのみ依存します。