23 votes

Pourquoi vouloir allouer de la mémoire sur le tas plutôt que sur la pile ?

Duplicata possible :
Quand est-il préférable d'utiliser un Stack au lieu d'un Heap et vice versa ?

J'ai lu quelques-unes des autres questions concernant le tas et la pile, mais elles semblent se concentrer davantage sur ce que font le tas et la pile que sur les raisons de les utiliser.

Il me semble que l'allocation à la pile serait presque toujours préférée car elle est plus rapide (il suffit de déplacer le pointeur de la pile plutôt que de chercher un espace libre dans le tas), et vous n'avez pas à libérer manuellement la mémoire allouée lorsque vous avez fini de l'utiliser. La seule raison que je vois pour utiliser l'allocation au tas est de créer un objet dans une fonction et de l'utiliser ensuite en dehors de la portée de cette fonction, puisque la mémoire allouée à la pile est automatiquement désallouée après le retour de la fonction.

Y a-t-il d'autres raisons d'utiliser l'allocation au tas au lieu de l'allocation à la pile dont je n'ai pas connaissance ?

0voto

Rohit Banga Points 3122

Juste pour ajouter vous pouvez utiliser alloca pour allouer de la mémoire sur la pile, mais là encore, la mémoire sur la pile est limitée et l'espace n'existe que pendant l'exécution de la fonction. Cela ne veut pas dire que tout doit être alloué sur la pile. décisions de conception ce qui est également assez difficile, une combinaison "judicieuse" des deux doit être utilisée.

0voto

AndreyT Points 139512

Outre le contrôle manuel de la durée de vie des objets (que vous avez mentionné), les autres raisons d'utiliser le tas sont les suivantes :

  • Contrôle en cours d'exécution de la taille de l'objet (à la fois sa taille initiale et sa taille "ultérieure", pendant l'exécution du programme).

Par exemple, vous pouvez allouer un tableau d'une certaine taille, qui n'est connue qu'au moment de l'exécution.

Avec l'introduction de VLA (Variable Length Arrays) en C99, il est devenu possible d'allouer des tableaux de taille fixe à l'exécution sans utiliser le tas (il s'agit essentiellement d'une implémentation au niveau du langage de la fonctionnalité 'alloca'). Cependant, dans d'autres cas, vous auriez toujours besoin du tas, même en C99.

  • Contrôle en cours d'exécution du nombre total d'objets.

Par exemple, lorsque vous construisez une structure d'arbre binaire, vous ne pouvez pas allouer de manière significative les nœuds de l'arbre sur la pile à l'avance. Vous devez utiliser le tas pour les allouer "à la demande".

  • Des considérations techniques de bas niveau, comme l'espace de pile limité (d'autres l'ont déjà mentionné).

Lorsque vous avez besoin d'un grand tampon d'entrée/sortie, par exemple, même pour une courte durée (dans une seule fonction), il est plus logique de le demander au tas plutôt que de déclarer un grand tableau automatique.

0voto

IanNorton Points 3797

Les variables de pile (souvent appelées "variables automatiques") sont utilisées de préférence pour les éléments qui doivent toujours être identiques et de petite taille.

int x;
char foo[32];

sont toutes des allocations de pile, elles sont également fixées au moment de la compilation.

La meilleure raison pour l'allocation du tas est que vous ne pouvez pas toujours savoir de combien d'espace vous avez besoin. Souvent, vous ne le savez qu'une fois le programme en cours d'exécution. Vous pouvez avoir une idée des limites mais vous ne voulez utiliser que la quantité exacte d'espace nécessaire.

Si vous deviez lire un fichier dont la taille peut varier de 1 000 à 50 mégaoctets, vous ne feriez pas cela :-.

int readdata ( FILE * f ) {
  char inputdata[50*1024*1025];
  ...
  return x;
}

On essaierait d'allouer 50 mégaoctets sur la pile, ce qui échouerait généralement car la pile est de toute façon limitée à 256 ko.

0voto

mduvall Points 691

La pile et le tas partagent le même espace mémoire "ouvert" et devront éventuellement arriver à un point de rencontre, si vous utilisez la totalité du segment de mémoire. En maintenant l'équilibre entre l'espace que chacun d'eux utilise, le coût amorti plus tard pour l'allocation et la désallocation de la mémoire aura une valeur asymptotique plus petite.

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