Якщо припустити реалізацію, яка насправді має стек та купу (стандартний 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);
}