std::vector : dynamique ou statique, pile et tas
Bonjour, si je fais
std::vector<double> v(5);
la variable v est-elle une variable statique (donc stockée dans la pile ?) ou bien une variable dynamique (donc stockée dans le tas ?) ?
Si je fais
double * w=new double[5];
Ma variable w est dynamique.
Donc d'un point de vue temps d'accès lequel est le plus rapide v[i] ou w[i] ?
Concernant la pile et le tas, pouvez-vous m'expliquer la différence de "localisation" dans la RAM de mon PC s'il vous plait ? et quelle est leur taille sachant que j'ai 1 Go de RAM ?
Merci beaucoup !
Re: std::vector : dynamique ou statique, pile et tas
Citation:
Envoyé par salseropom
Bonjour, si je fais
std::vector<double> v(5);
la variable v est-elle une variable statique (donc stockée dans la pile ?) ou bien une variable dynamique (donc stockée dans le tas ?) ?
Si la déclaration du vecteur est hors de toute classes ou fonctions, où qu'elle est static dans une classe ou une fonction, elle sera déclarée dans un segment spécial de l'exécutable, (segment des données initialisée, correspondant à DS (Data Segment).
Si cette déclaration est celle d'une variable de fonction, membre ou non, le vecteur sera une variable automatique, stockée en pile.
Si le vecteur est une variable membre d'instance (non-static), celà dépend de la déclaration de l'objet. Si celui ci est une variable automatique, ses membres les sont également, si l'objet est alloué dynamiquement, le vecteur sera dans le tas.
Point de vu performance, si on doit comparer un vecteur STL en pile avec un vecteur STL dans le tas, comme pour toute variable (dans le cas d'un accès ponctuel et no pas répété), l'accès est un chouille plus long dans le tas puisque l'adresse de base doit être chargé depuis le pointeur qui contient l'adresse du vecteur (où de l'objet qui le possède, ce qui revient à un décalage près au même).
Dans le cas de la pile, son adresse est dans un registre processeur (ESP / EBP) qui avec le décalage fournit dans l'instruction suffit à retrouver le vecteur (1 instruction MOV de moins pour le premier accès donc).
Ceci dis, tout ça ne concerne pas l'accès aux valeurs au sein du vecteur, mais les autres post en discute déjà.
Ma conclusion sera la même : pas de différence significative, mais comparons des choses comparables !!