web-dev-qa-db-ja.com

配列にインデックスを付けるときは常にsize_tを使用する必要がありますか?

配列が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
  • ビット配列の場合は任意精度の整数(aint)(ビット配列のsize()メソッドがaintを返す場合)
  • メモリに圧縮された配列の場合はaint(配列のsize()メソッドがaintを返す場合)
  • 複数のマシンにまたがる配列の場合はaint(配列のsize()メソッドがaintを返す場合)
  • C++以外の言語:
    • int _Java.util.Collection_とそのサブクラスの場合

要約すると、安全なインデックスタイプは、size()メソッドによって返されるタイプです。

注:size()メソッドが符号なし_size_t_を返す場合、符号付きintおよび_ssize_t_は安全なインデックスタイプではありません。 gccとclangの場合、コンパイラフラグ_-Wsign-compare_(_-Wall_で有効)と_-Wconversion_を使用して、これらのケースのほとんどを防ぐことができます。

0
atomsymbol