web-dev-qa-db-ja.com

ベクトルが割り当てられるとき、それらはヒープまたはスタック上のメモリを使用しますか?

次のすべての説明は正しいですか?

vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack

vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack

vector<Type*> vect; //vect will be on stack and Type* will be on heap. 

Typeまたは他のSTLコンテナのvectorに内部的にメモリはどのように割り当てられますか?

138
Phelodas
vector<Type> vect;

vector、つまりヘッダー情報をスタックに割り当てますが、フリーストアの要素(「ヒープ」)を割り当てます。

vector<Type> *vect = new vector<Type>;

無料ストアにすべてを割り当てます。

vector<Type*> vect;

スタックにvectorと空きストアに一連のポインターを割り当てますが、これらのポイントは使用方法によって決まります(要素0を空きストアに、要素1をスタックに、たとえば)。

196
Fred Foo

実際にスタックとヒープを持つ実装を想定すると(標準C++はそのようなものを必要としません)、唯一の真のステートメントは最後のものです。

vector<Type> vect;
//allocates vect on stack and each of the Type (using std::allocator) also will be on the stack

これは、最後の部分を除いて当てはまります(Typeはスタック上にありません)。想像してみてください:

  void foo(vector<Type>& vec) {
     // Can't be on stack - how would the stack "expand"
     // to make the extra space required between main and foo?
     vec.Push_back(Type());
  }

  int main() {
    vector<Type> bar;
    foo(bar);
  }

同様に:

 vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack

最後の部分を除いて真で、同様の反例があります:

  void foo(vector<Type> *vec) {
     // Can't be on stack - how would the stack "expand"
     // to make the extra space required between main and foo?
     vec->Push_back(Type());
  }

  int main() {
    vector<Type> *bar = new vector<Type>;
    foo(bar);
  }

ために:

vector<Type*> vect; //vect will be on stack and Type* will be on heap. 

これは本当ですが、ここでType*ポインターはヒープ上にありますが、それらが指すTypeインスタンスは次のとおりである必要はありません。

  int main() {
    vector<Type*> bar;
    Type foo;
    bar.Push_back(&foo);
  }
23
Flexo
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack

いいえ、vectはスタック上にありますが、項目を格納するために内部的に使用する配列はヒープ上にあります。アイテムはその配列に存在します。

vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack

いいえ。上記と同じですが、vectorクラスもヒープ上にあります。

vector<Type*> vect; //vect will be on stack and Type* will be on heap. 

vectはスタック上にあり、そのアイテム(Typeへのポインター)はヒープ上にあり、ポインターが指すTypesはどこにあるかわかりません。スタック上、ヒープ上、グローバルデータ内、どこにも存在しない可能性があります(つまり、NULLポインター)。

ところで、実際には、実装はいくつかのベクトル(通常は小さなサイズ)を完全にスタックに格納できます。そのような実装を知っているわけではありませんが、できます。

21
jpalecek

次のステートメントのみが真です。

vector <Type*> vect; //vect will be on stack and Type* will be on heap.

Type*ポインターはヒープに割り当てられます。これは、ポインターの量が動的に変化する可能性があるためです。

この場合、vectはローカルスタック変数として定義したため、スタックに割り当てられます。

3