web-dev-qa-db-fra.com

Mémoire de pile vs mémoire de tas

Duplicate possible:
Quoi et où sont la pile et le tas

Je suis en train de programmer en C++ et je me demande toujours en quoi consiste exactement la mémoire de pile et la mémoire de tas. Tout ce que je sais, c’est que lorsque j’appellerai nouveau, j’aurais la mémoire de tas. Si créer des variables locales, j'aurais de la mémoire de la pile. Après quelques recherches sur Internet, la réponse la plus courante est que la mémoire de pile est temporaire et que la mémoire de tas est permanente.

Le modèle de mémoire de pile et de tas est-il un concept de système d'exploitation ou d'architecture informatique? Donc, certains d'entre eux pourraient ne pas suivre le modèle de pile ou de mémoire en tas ou tous les suivre?

La mémoire de pile et de pile est l'abstraction sur le modèle de mémoire de la mémoire virtuelle (qui peut permuter la mémoire entre disque et RAM). La mémoire de pile et la mémoire de tas peuvent donc être physiquement RAM ou le disque? Alors quelle est la raison pour laquelle l'allocation de tas semble être plus lente que la contrepartie de la pile?

En outre, le programme principal serait exécuté dans la pile ou un tas?

En outre, que se passerait-il si un processus venait à manquer de mémoire de pile ou de mémoire de tas allouée?

Merci

85
Steveng

En C++, la mémoire de pile est l'endroit où les variables locales sont stockées/construites. La pile sert également à contenir les paramètres transmis aux fonctions.

La pile est très semblable à la classe std :: stack, vous lui transmettez des paramètres, puis appelez une fonction. La fonction sait alors que les paramètres attendus se trouvent à la fin de la pile. De même, la fonction peut pousser des sections locales sur la pile et les extraire avant de revenir de la fonction. (les optimisations du compilateur et les conventions d’appel signifient que tout n’est pas aussi simple)

La pile est vraiment mieux comprise à partir d’un niveau bas et je recommanderais ce lien Art of Assembly - Passing Parameters on the Stack . Il est rare que vous envisagiez de manipuler manuellement une pile à partir de C++.

De manière générale, la pile est préférable au cache du processeur, de sorte que les opérations impliquant des objets stockés dessus ont tendance à être plus rapides. Cependant, la pile est une ressource limitée et ne devrait pas être utilisée pour des objets volumineux. Le fait de manquer de mémoire est appelé un débordement de tampon de pile . C'est une chose sérieuse à rencontrer, mais vous ne devriez vraiment pas en trouver une à moins d'avoir une fonction récursive folle ou quelque chose de similaire.

La mémoire de tas est beaucoup comme le dit rskar. En règle générale, dans C++, les objets alloués avec du nouveau ou des blocs de mémoire alloués avec le type malloc finissent sur le tas. La mémoire de tas doit presque toujours être libérée manuellement, bien que vous deviez utiliser réellement une classe de pointeur intelligent ou similaire pour éviter de vous rappeler de le faire. Manquer de mémoire peut entraîner (va?) Dans un std :: bad_alloc.

54
Eoin

La mémoire de pile est spécifiquement la plage de mémoire accessible via le registre de pile de la CPU. La pile a été utilisée comme moyen d'implémenter le modèle de code "Jump-Subroutine" - "Return" en langage Assembly, ainsi que comme moyen d'implémenter la gestion des interruptions au niveau matériel. Par exemple, pendant une interruption, la pile était utilisée pour stocker divers registres de la CPU, y compris Status (qui indique les résultats d’une opération) et le compteur de programme (où se trouvait la CPU dans le programme lorsque l’interruption s’est produite).

La mémoire de pile est bien la conséquence de la conception habituelle du processeur. La rapidité de son allocation/désallocation est rapide car il s’agit strictement d’une conception dernier entré/premier sorti. Il s’agit simplement d’une opération de déplacement et d’une opération de décrémentation/incrémentation du registre de pile.

La mémoire de tas était simplement la mémoire qui restait après le chargement du programme et l'allocation de la mémoire de pile. Il peut (ou non) inclure un espace variable global (c'est une question de convention).

Les systèmes d’exploitation multitâche préemptifs modernes avec mémoire virtuelle et périphériques mappés en mémoire rendent la situation réelle plus compliquée, mais c’est en bref Stack vs Heap.

31
rskar

C'est une abstraction linguistique - certaines langues ont les deux, certaines personnes, d'autres non plus.

Dans le cas de C++, le code n'est exécuté ni dans la pile ni dans le tas. Vous pouvez tester ce qui se passe si vous manquez de mémoire vive en appelant plusieurs fois new pour allouer de la mémoire dans une boucle sans appeler delete pour la libérer. Mais faites une sauvegarde du système avant de faire cela.

2
Neil Butterworth