次のすべての説明は正しいですか?
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
に内部的にメモリはどのように割り当てられますか?
vector<Type> vect;
vector
、つまりヘッダー情報をスタックに割り当てますが、フリーストアの要素(「ヒープ」)を割り当てます。
vector<Type> *vect = new vector<Type>;
無料ストアにすべてを割り当てます。
vector<Type*> vect;
スタックにvector
と空きストアに一連のポインターを割り当てますが、これらのポイントは使用方法によって決まります(要素0を空きストアに、要素1をスタックに、たとえば)。
実際にスタックとヒープを持つ実装を想定すると(標準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);
}
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
へのポインター)はヒープ上にあり、ポインターが指すType
sはどこにあるかわかりません。スタック上、ヒープ上、グローバルデータ内、どこにも存在しない可能性があります(つまり、NULL
ポインター)。
ところで、実際には、実装はいくつかのベクトル(通常は小さなサイズ)を完全にスタックに格納できます。そのような実装を知っているわけではありませんが、できます。
次のステートメントのみが真です。
vector <Type*> vect; //vect will be on stack and Type* will be on heap.
Type*
ポインターはヒープに割り当てられます。これは、ポインターの量が動的に変化する可能性があるためです。
この場合、vect
はローカルスタック変数として定義したため、スタックに割り当てられます。