En supposant une implémentation qui a en fait une pile et un tas (le C ++ standard ne fait aucune obligation d'avoir de telles choses), la seule vraie déclaration est la dernière.
vector<Type> vect;
//allocates vect on stack and each of the Type (using std::allocator) also will be on the stack
C'est vrai, sauf pour la dernière partie ( Type
ne sera pas sur la pile). Imaginer:
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);
}
Également:
vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack
Vrai sauf la dernière partie, avec un exemple de compteur similaire:
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);
}
Pour:
vector<Type*> vect; //vect will be on stack and Type* will be on heap.
c'est vrai, mais notez ici que les Type*
pointeurs seront sur le tas, mais les Type
instances vers lesquelles ils pointent n'ont pas besoin d'être:
int main() {
vector<Type*> bar;
Type foo;
bar.push_back(&foo);
}