8
votes

Variables automatiques en C ++

Dupliqué possible:
en C ++, pourquoi nouveau < / code> être utilisé aussi peu que possible?

Où sont des variables automatiques allouées en C ++? Sur la pile ou le tas?

Aussi, j'ai lu dans 7.9 - La pile et le tas que tout la mémoire allouée sur la pile est connue à l'heure de la compilation. Est-ce vrai? Cela signifie-t-il que seule une allocation de mémoire statique se produit sur la pile?

En outre, veuillez mentionner des liens, références à un texte explicatif complet sur l'allocation de mémoire en C ++.


4 commentaires

Voir Cette question pour un détail Explication de l'allocation variable C ++.


C ++ est une langue Langue , pas une implémentation, elle n'a donc pas de concepts comme une "pile"; Ces trucs sont laissés aux compilateurs et aux plates-formes spécifiques. Il est possible que chaque objet avec durée de stockage automatique soit attribué sur le tas. En pratique, cependant, c'est toujours la pile. Mais gardez à l'esprit si vous avez vraiment besoin de connaître cette information, vous allez poser une question sur une plate-forme, pas sur C ++. Soit C ++ être c ++ la langue et ne vous inquiétez pas. Aussi, n'apprenez pas C ++ à partir d'Internet, vous devriez obtenir un Bon livre < / a>.


@Gman: Les variables automatiques ne sont pas toujours sur la pile en pratique. Voir ma réponse.


@Peter: Oui, peut-être toujours un peu fort, mais certainement la plupart du temps. Les registres sont une ressource très rare.


4 Réponses :


2
votes

Les variables automatiques (locales) ne sont pas allouées sur le tas. Ils vivront sur la pile ou dans un registre.

Et oui, toutes les allocations de pile sont connues au moment de la compilation.

Le lien que vous avez référencé est en fait une assez bonne ressource pour décrire comment C ++ gère la mémoire.


0 commentaires


19
votes

C ++ n'a pas le concept d'une pile ni de tas, il s'agit d'un détail de mise en œuvre en ce qui concerne la langue concernée .

qui étant dit, chaque mise en œuvre que je connaisse utilise la pile gérer la durée de vie des variables locales. Cependant, de nombreuses variables locales peuvent se retrouver entièrement dans les registres et ne jamais toucher la pile, et certaines variables locales peuvent être optimisées complètement. Ce n'est pas parce que vous déclarez une variable automatique ne signifie pas qu'elle sera mise sur la pile.

par exemple xxx

dans ce code, avec des optimisations sur , la variable y sera presque certainement supprimée complètement et variable x sera probablement donné son propre registre. Il est peu probable que l'une de ces variables existerait jamais sur la pile.


4 commentaires

Bien dit. Je déteste quand la police "normes" saute et arrête simplement une citation de la norme sainte. Grands exemples.


Il existe également la considération que les variables des membres pourraient faire référence à la mémoire dynamique, même si l'objet environnant a une durée de stockage automatique. Si vecteur v; est automatique, et donc probablement sur la "pile", v [0] est toujours certainement certainement sur le "tas".


@Dennis: Vous avez raison de dire que le contenu d'un vecteur sera (probablement) sur le tas, même lorsque le vecteur lui-même est sur la pile, mais ses variables de membre ne sont pas déclarées avec un stockage automatique (la classe de stockage automatique ne peut être que Utilisé avec des variables locales, y compris les paramètres), il semble donc être distinct de la question posée.


Oui je suis d'accord. Mon commentaire a été principalement destiné à développer sur l'idée que "la variable locale ==> pile" n'est pas une simplification particulièrement utile, même si la langue n'était pas silencieuse sur l'idée d'une pile réellement existante.



0
votes

En plus de localiser certaines variables locales dans des registres ou sur la pile, certains compilateurs peuvent choisir de réutiliser des registres ou une mémoire spécifiques si elle peut être déterminée lors de la compilation de la durée de vie utilisable d'un objet est limitée aux régions du code. .

Par exemple, P>

{
int a;
// do something with a

int b;
// do something with b but nothing with a
}


0 commentaires