104 votes

Pourquoi la taille de la mémoire de la pile est-elle si limitée ?

Lorsque vous allouez de la mémoire sur le tas, la seule limite est la RAM libre (ou la mémoire virtuelle). Cela fait des Go de mémoire.

Alors pourquoi la taille de la pile est-elle si limitée (environ 1 Mo) ? Quelle raison technique vous empêche de créer des objets très volumineux sur la pile ?

Mise à jour : Mon intention n'est peut-être pas claire, je ne veulent pas pour allouer des objets énormes sur la pile et je n'ont pas besoin une plus grande pile. Cette question n'est que pure curiosité !

3voto

mosegui Points 188

L'allocation d'objets volumineux dans une pile de 100 Mo, par exemple, rendrait impossible sur la plupart des machines leur chargement simultané dans le cache, ce qui va à l'encontre de l'objectif de la pile.

L'intérêt de la pile est d'avoir de petits objets qui appartiennent à la même portée (et qui sont, par conséquent, généralement nécessaires ensemble ou proches les uns des autres) stockés ensemble dans des adresses mémoire contiguës, de sorte que le programme puisse les charger tous en même temps dans le cache, minimisant ainsi les ratés du cache et, en général, le temps que le CPU doit attendre jusqu'à ce qu'il obtienne un morceau de données manquant de la RAM plus lente.

Un objet de 50 Mo stocké dans la pile ne tiendrait pas dans le cache, ce qui signifie qu'après chaque ligne de cache, il y aurait un temps d'attente du CPU jusqu'à ce que le prochain élément de données soit apporté de la RAM, ce qui signifie que l'on encombrerait la pile d'appels et que l'on n'obtiendrait aucun avantage significatif (en termes de vitesse) par rapport au chargement depuis le tas.

1voto

Mike Crawford Points 1592

La plupart des choses pour lesquelles vous pensez avoir besoin d'une grosse pile peuvent être réalisées d'une autre manière.

Le livre "Algorithms" de Sedgewick contient quelques bons exemples de "suppression" de la récursion d'algorithmes récursifs tels que QuickSort, en remplaçant la récursion par l'itération. En réalité, l'algorithme est toujours récursif, et il y a toujours une pile, mais vous allouez la pile de tri sur le tas, plutôt que d'utiliser la pile d'exécution.

(Je préfère la deuxième édition, avec les algorithmes donnés en Pascal. On peut l'avoir d'occasion pour 8 dollars).

Une autre façon de voir les choses est que si vous pensez avoir besoin d'une grande pile, votre code est inefficace. Il existe une meilleure méthode qui utilise moins de pile.

1voto

user2881022 Points 11

Si vous pouvez avoir une pile infinie, alors chaque adresse virtuelle peut potentiellement être utilisée par la pile. Si la pile peut utiliser toutes les adresses, alors il n'y a pas de place pour le tas. Chaque adresse que vous avez choisie pour une variable du tas pourrait être écrasée par une pile croissante.

En d'autres termes, les variables sur la pile et les variables sur le tas occupent le même espace d'adressage virtuel. Nous avons besoin d'un moyen d'empêcher l'allocateur du tas d'allouer des données dans lesquelles la pile pourrait s'étendre. Une taille de pile est un moyen facile de le faire. L'allocateur du tas sait que les adresses de la pile sont prises et il utilise donc autre chose.

-9voto

Martin James Points 15655

Je ne pense pas qu'il y ait de raison technique, mais ce serait une application étrange qui créerait juste un énorme super-objet sur la pile. Les objets de la pile manquent de flexibilité, ce qui devient plus problématique avec l'augmentation de la taille - vous ne pouvez pas revenir sans les détruire et vous ne pouvez pas les mettre en file d'attente vers d'autres threads.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X