web-dev-qa-db-ja.com

C ++またはC、あるいはその両方でのsize_tとint

C++コンテナでintではなくsize_typeを返すのはなぜですか?独自の構造を作成する場合、size_typeを使用することも推奨されますか?

29
John Jiang

一般に、何かのサイズを測定するときは常に_size_t_を使用する必要があります。 _size_t_が0〜_SIZE_MAX_バイトを表すためにのみ必要であり、_SIZE_MAX_が65,535のみを必要とすることは本当に奇妙です...

C++およびC標準からの他の興味深い制約は次のとおりです。

  • sizeof()の戻り値の型は_size_t_であり、それは符号なし整数です。
  • operator new()は、割り当てるバイト数を_size_t_パラメータとして受け取ります
  • _size_t_は_<cstddef>_で定義されています
  • _SIZE_MAX_はC99の_<limits.h>_で定義されていますが、C++ 98では言及されていません!
  • _size_t_は基本整数型のリストに含まれていないため、_size_t_は基本型の1つに対する型エイリアスであると常に想定しています:char 、_short int_、int、および_long int_。

バイトをカウントしている場合は、必ず_size_t_を使用する必要があります。要素の数を数える場合、C++が使用しているように見えるので、おそらく_size_t_を使用する必要があります。いずれの場合でも、intは使用しないでください。TR1を使用している場合は、少なくとも_unsigned long_または_unsigned long long_を使用してください。または...さらに良い... typedef _size_type_に使用するものは何でも、または_<cstddef>_を含めて_std::size_t_を使用するだけでもかまいません。

26
D.Shawley

いくつかの理由が考えられます。

  • タイプ(size_t)は、そのプラットフォームで最大の符号なし整数として定義できます。たとえば、32ビット整数または64ビット整数など、完全な長さの符号なし値を格納できるものとして定義される場合があります。
  • プログラムを読み取るときに、値が単なる「通常の」intではなくサイズであることを明確にする

自分だけのアプリや使い捨てのアプリを作成しているのであれば、おそらく基本的なintを使用するのが良いでしょう。ライブラリなどの実質的なものを作成している場合は、おそらくsize_tがより良い方法です。

9
Dave

一部の回答は必要以上に複雑です。 size_tは、メモリ内のオブジェクトのサイズをバイト単位で格納するのに十分な大きさであることが保証されている符号なし整数型です。実際には、常にポインタ型と同じサイズです。 32ビットシステムでは、32ビットです。 64ビットシステムでは、64ビットです。

5
Andy Ross

Stlのすべてのコンテナには、さまざまなtypedefがあります。たとえば、value_typeは要素のタイプであり、size_typeは格納されている数値のタイプです。このように、コンテナはプラットフォームと実装に基づいて完全に汎用的です。

独自のコンテナを作成する場合は、size_typeも使用する必要があります。通常、これは行われます

typedef std::size_t size_type;

コンテナーのサイズが必要な場合は、

typedef vector<int> ints;
ints v;
v.Push_back(4);
ints::size_type s = v.size();

いいのは、後でリストを使用したい場合は、typedefを次のように変更するだけです。

typedef list<int> ints;

そしてそれはまだ働きます!

2
rlbond

C++は、さまざまなハードウェアアーキテクチャおよびプラットフォームに実装できる言語です。時が経つにつれ、16ビット、32ビット、64ビットのアーキテクチャがサポートされ、将来的には他のアーキテクチャもサポートされる可能性があります。 size_typeおよびその他の型エイリアスは、ライブラリ/プログラマー/コードを実装の詳細から隔離する方法です。

size_typeが32ビットマシンで32ビットを使用し、64ビットマシンで64ビットを使用すると仮定すると、必要に応じてsize_typeを使用している場合は、同じソースコードがより適切に機能します。ほとんどの場合、これはunsigned intと同じであると想定できますが、保証されていません。

size_typestd::vector のようにSTLコンテナの容量を表すために使用されますが、size_tはCでオブジェクトのバイトサイズを表すために使用されます/ C++。

1
Eugene Yokota

私はあなたが「size_t」を意味していると思います-これは、符号なし整数(正の値のみで、負の値にはならない整数)を示す方法です-サイズのある配列を持つことができないため、コンテナーのサイズに意味がありますの-7。 size_tを使用する必要があるとは言いませんが、「この数値は常に正数です」というコードを使用している他の人にそれを示しています。また、正の数の範囲が広がりますが、非常に大きなコンテナがない限り、それは重要ではない可能性があります。

1
MatrixFrog

_size_t_は符号なしなので、どちらも32ビットであっても、修飾されていないintとまったく同じことを意味するわけではありません。彼らが型を追加した理由はわかりませんが、今日の多くのプラットフォームではsizeof (size_t) == sizeof (int) == sizeof (long)なので、どの型を選択するかはあなた次第です。これらの関係は規格によって保証されておらず、64ビットプラットフォームが導入されるにつれて急速に古くなっていることに注意してください。

独自のコードの場合、「サイズ」を概念的に表現する必要があり、負になることは決してない場合は、_size_t_が最適です。

0
Dan Olson

仕様では、intは4バイトであることが保証されていないため、信頼性はありません。はい、size_typeはintよりも優先されます

0
Charles Ma