Dupliqué possible: strong>
en C ++, pourquoinouveau < / code> être utilisé aussi peu que possible?
P> blockQuote>Où sont des variables automatiques allouées en C ++? Sur la pile ou le tas? P>
Aussi, j'ai lu dans 7.9 - La pile et le tas em> que tout em> 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? P>
En outre, veuillez mentionner des liens, références à un texte explicatif complet sur l'allocation de mémoire en C ++. P>
4 Réponses :
Les variables automatiques (locales) ne sont pas allouées sur le tas. Ils vivront sur la pile ou dans un registre. P>
Et oui, toutes les allocations de pile sont connues au moment de la compilation. P>
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. P>
Oui, les Varés automobiles sont alloués, le plus souvent, sur la pile (la norme C ++ spécifie ne spécifie pas la "pile" mais elle est suffisamment sûre pour supposer que). P>
Vous pouvez utiliser la pile pour allouer la mémoire dynamique avec la fonction alloca () code>, mais ce n'est pas très bonne pratique, plus à ce sujet dans cette question: Pourquoi est l'utilisation d'Alloca () non considérée comme une bonne pratique? P>
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. P> par exemple p> dans ce code, avec des optimisations sur , la variable y code> sera presque certainement supprimée complètement et variable
x code> sera probablement donné son propre registre. Il est peu probable que l'une de ces variables existerait jamais sur la pile. P> p>
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 [0] code> 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.
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 }
Voir Cette question pour un détail Explication de l'allocation variable C ++.
C ++ est une langue Langue i>, 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.