4

私はクラスのリンゴを持っています

class apples
{
  private:
      double x;
      double y;
      double z;
  public:
      //some methods
};

りんごオブジェクトへのポインターをベクターに格納したいと思います。私はこれを行っているので、任意のファイルで任意のオブジェクトを作成し、任意のファイルで任意のオブジェクトを使用します。次のコードを使用して、そのベクターに格納できるポインターの最大数を決定しました

int _tmain(int argc, _TCHAR* argv[])
{
vector<apples *> myvector;
cout<<"max :"<<myvector.max_size();
return 0;
}

それは私に与えました:

1073741823

さて、私の質問は、そのベクターに1073741823個のポインターを実際に保存できるか、それともベクターのメモリ制限(つまり、1073741823バイト)ですか?

2つのベクトルがある場合

vector<int> A
& 
vector<double> B

A に 1073741823 要素を持たせ、B にも 1073741823 要素を持たせることはできますか? ベクトルが格納できる要素の最大数は、格納されるエンティティのタイプ (int または double) に依存しないことを明確にするために、これを求めて いますか? (これはベクトルの現在の容量とは何の関係もありません!) また、りんごオブジェクトへのポインタのサイズは? (りんごオブジェクトのサイズを尋ねるのではありません!) ありがとうございました。

4

6 に答える 6

7

これは、ベクトルに要素を格納するためのライブラリの制限です。

vector::max_size():

ベクター コンテナーが保持できる要素の最大数を返します。

これは、ベクターに現在割り当てられている記憶域の量ではありません (これは、メンバー vector::capacity で取得できます) が、システムまたはライブラリの実装の制限により、ベクターが到達する可能性のある最大サイズです。

そのため、それ以上は保存できません (実際には、システムの制限により、それよりも少ない可能性があります) 。

つまり、最高のリソース (メモリ、CPU など) の能力があり、要素のサイズが最小であっても、それ以上は格納できません。max_size()

ヘッダー ファイルのコメントによると、max_size()可能な限り最大の %vector のサイズを返します。

于 2011-10-24T10:50:27.490 に答える
4

max_sizeベクトルが保持できる要素数の上限を返します。v.resize(v.max_size())これは、それが成功するという意味ではありません。それは単にv.resize(v.max_size() + 1)失敗することを意味します。

于 2011-10-24T10:52:52.850 に答える
2

また、applesオブジェクトへのポインタのサイズはどのくらいですか(applesオブジェクトのサイズを尋ねないでください!)?

一部の言語弁護士がやって来て、これは正しくないと指摘するでしょうが、実際には、32ビットビルドは32ビットポインターを使用するため、オブジェクトへのポインターは4バイトです。64ビットビルドでは、ポインターごとに8バイトを取得します。

于 2011-10-24T10:57:23.860 に答える
2

これは、リソースの制限(CPU、メモリ、時間)に拘束されない場合、ベクターがそれ以上アイテムを追加できなくなるサイズです。

実際に保存できる量は、主にメモリの制約があるため、通常は大幅に少なくなります。

現在の容量は、を呼び出すことで確認vector::capacity()できます。現在の設定でベクトルをどこまで伸ばすことができるかを知りたい場合は、bad_alloc例外がスローされるまでベクトルのサイズを変更し続けます)

于 2011-10-24T11:02:34.590 に答える
1

そのベクターに 1073741823 個のポインターを本当に格納できますか、それともベクターのメモリ容量ですか?

max_size()のこの実装はvectorそれより大きいサイズを処理できないことを示しています。ベクトルを格納するのに十分なメモリがあれば、そのサイズまでのベクトルが可能です。

ベクトルに格納できるエンティティの最大数は、エンティティのタイプによって異なりますか? はいの場合、それを計算する方法は?

それは、両方の実装vectorと、それが使用するアロケータに依存します。実際には、通常はそうなります。おそらく、次のようなものに等しいことがわかりますnumeric_limits<size_t>::max() / sizeof (value_type)。配列に割り当てることができる最大バイト数をオブジェクト サイズで割った値。

また、apples オブジェクトへのポインタのサイズはどのくらいになるでしょうか (apples オブジェクトのサイズを尋ねるのではありません!)。

それはプラットフォームによって異なります。は非常に小さいのでmax_size()、32 ビット プラットフォームを使用していると思います。この場合、ポインターは 32 ビット (4 バイト) になります。他のプラットフォームでは、ポインターのサイズが異なります。

于 2011-10-24T11:07:25.807 に答える
0

16 進数 (1073741823) = '0x3ffffff'

つまり、事前に定義された制限のように見えます。

于 2011-10-24T10:51:25.133 に答える