配列がintのサイズを超えるほど大きくない場合でも、配列にインデックスを付けるときは常にsize_t
を使用する必要がありますか?
いつsize_t
を使うべきかについては問題ではありません。たとえば、2GBの使用可能なメモリ(これらのフィールドはすべてint32でインデックスを付けることができます)を持っているが、このメモリが(仮想メモリ)「フィールド」に割り当てられているかどうかを知りたいだけです14GB-コンピュータの16GB羊。
この場合、int32
(またはsize_t
)の代わりにunsigned long int
を使用した場合、メモリのインデックス作成時に常に失敗しますか?
たぶん、質問はポインタよりも仮想メモリに関するものです。
プログラムの失敗を回避するために、プログラマーは常に、少なくともsize()
メソッドによって返される型と同じ大きさのインデックス型を使用する必要があります。これにより、インデックスが配列の可能なサイズをオーバーフローすることがなくなります。配列の実装は通常、その実行時サイズがsize()
メソッドによって返される型をオーバーフローしないようにします。つまり、インデックスタイプは次のようになります。
size_t
_ _char[N]
_、_uint8_t[N]
_、_int[N]
_などの場合size_t
_ _std::vector
_および_std::list
_の場合int
およびQList
の場合はQVector
size()
メソッドがaintを返す場合)size()
メソッドがaintを返す場合)size()
メソッドがaintを返す場合)int
_Java.util.Collection
_とそのサブクラスの場合要約すると、安全なインデックスタイプは、size()
メソッドによって返されるタイプです。
注:size()
メソッドが符号なし_size_t
_を返す場合、符号付きint
および_ssize_t
_は安全なインデックスタイプではありません。 gccとclangの場合、コンパイラフラグ_-Wsign-compare
_(_-Wall
_で有効)と_-Wconversion
_を使用して、これらのケースのほとんどを防ぐことができます。