229 votes

répartition des vecteurs, mémoire sur le tas ou pile ?

Je suis un peu confus au sujet de quelque chose

Je vais commencer par cela

Ce que je voudrais savoir est, sont tous de la vraie énoncés ci-dessus ?

Comment est la mémoire allouée pour le Type en interne dans un vecteur ou tout autre conteneur STL d’ailleurs ?

327voto

larsmans Points 167484
vector<Type> vect;

va allouer de l' vector, c'est à dire l'en-tête info, sur la pile, mais les éléments sur le free store ("tas").

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

alloue tout sur le free store.

vector<Type*> vect;

va allouer de l' vector sur la pile et tout un tas de conseils sur le free store, mais où ces point est déterminé par la façon dont vous les utilisez (vous pourriez point de l'élément 0 de la boutique et de l'élément 1 de la pile, par exemple).

43voto

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

Non, vect sera sur la pile, mais le tableau qu'il utilise en interne pour stocker les articles seront sur le tas. Les articles pourront résider dans ce tableau.

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

Pas de. Même que ci-dessus, juste l' vector classe sera sur le tas.

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

vect sera sur la pile, ses éléments (des pointeurs vers Type) sera sur le tas, et vous ne pouvez pas dire où sera l' Types les pointeurs pointent. Pourrait être sur la pile, pourrait être sur le tas, pourrait être dans les données globales, pourrait être nulle part (ie. NULL des pointeurs).

BTW la mise en œuvre pourrait, en fait, stocker des vecteurs (généralement de petite taille) sur la pile entièrement. Pas que je sache de toute cette mise en œuvre, mais elle le peut.

25voto

Flexo Points 39273

En supposant une mise en œuvre qui est en fait une pile et un segment (C++ standard de fait, ne nécessite pas de telles choses) la seule vraie déclaration est le dernier.

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). Imaginez:

  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);
  }

De la même manière:

 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 semblable contre-exemple:

  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 à noter ici que l' Type* des pointeurs seront sur le tas, mais l' Type des cas ils ont point besoin de ne pas être:

  int main() {
    vector<Type*> bar;
    Type foo;
    bar.push_back(&foo);
  }

3voto

user1016580 Points 136

Seulement cette affirmation est vraie :

``pointeurs sont alloués sur le tas, parce que le montant des pointeurs peut modifier de façon dynamique.

``dans ce cas est allouée sur la pile, parce que vous défini comme une variable locale de pile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X