Pile vs tas : les différences expliquées
Un programme en cours d'exécution utilise deux régions principales de mémoire pour ses données. La pile (stack) contient les cadres d'appel de fonction : variables locales, arguments et adresses de retour. Elle est gérée automatiquement et très rapide, mais petite et liée à la durée de vie de chaque appel de fonction. Le tas (heap) contient la mémoire que le programme demande explicitement, par exemple avec malloc ou new, et qui existe jusqu'à sa libération. Le tas est souple et vaste mais plus lent, et c'est là que surviennent les fuites et la fragmentation.
| Critère | Pile (stack) | Tas (heap) |
|---|---|---|
| Usage | Cadres d'appel de fonction : variables locales, arguments, adresses de retour | Données allouées dynamiquement qui doivent survivre à une fonction ou dont la taille n'est pas connue à l'avance |
| Allocation | Automatique : le pointeur de pile se déplace à chaque appel et à chaque retour | Explicite : malloc et free, new et delete, ou un garbage collector |
| Vitesse | Très rapide : il suffit d'ajuster un pointeur | Plus lente : l'allocateur doit trouver un bloc libre et tenir des registres |
| Durée de vie | Jusqu'au retour de la fonction | Jusqu'à la libération de la mémoire (ou son ramassage par le garbage collector) |
| Taille | Limitée (typiquement quelques mégaoctets par thread) | Limitée uniquement par la mémoire disponible |
| Disposition | Croît généralement vers le bas depuis les adresses hautes | Croît généralement vers le haut depuis des adresses plus basses : les deux croissent l'une vers l'autre |
| Fragmentation | Aucune | Possible : des allocations et libérations répétées peuvent laisser des trous inutilisables |
| Threads | Chaque thread possède sa propre pile privée | Partagé par tous les threads : l'allocateur doit donc être thread-safe |
| Erreurs typiques | Débordement de pile dû à une récursion profonde ou à de grands tableaux locaux | Fuites de mémoire, use after free, double libération et épuisement de la mémoire |
Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.