Lorsque vous appelez une fonction, un nouvel "espace de noms" est alloué sur la pile. C'est ainsi que les fonctions peuvent avoir des variables locales. Comme les fonctions appellent des fonctions, qui à leur tour appellent des fonctions, nous continuons à allouer de plus en plus d'espace sur la pile pour maintenir cette hiérarchie profonde d'espaces de noms.
Pour limiter les programmes utilisant des quantités massives d'espace de pile, une limite est généralement mise en place via ulimit -s
. Si nous supprimons cette limite via ulimit -s unlimited
, nos programmes pourront continuer à engloutir de la RAM pour leur pile sans cesse croissante jusqu'à ce que le système finisse par manquer complètement de mémoire.
int eat_stack_space(void) { return eat_stack_space(); }
// If we compile this with no optimization and run it, our computer could crash.
Habituellement, l'utilisation d'une tonne d'espace de pile est accidentelle ou le symptôme d'une récursivité très profonde qui ne devrait probablement pas dépendre autant de la pile. Ainsi la limite de pile.
L'impact sur la performance est mineur mais existe. Utilisation du time
commande, j'ai trouvé que l'élimination de la limite de pile augmentait les performances de quelques fractions de seconde (au moins sur Ubuntu 64 bits).
ulimit -s unlimited
permet à la pile de croître de manière illimitée.
Cela peut empêcher votre programme de planter si vous écrivez des programmes par récursivité, en particulier si vos programmes ne sont pas récursifs (les compilateurs peuvent les "optimiser") et que la profondeur de la récursivité est importante.
la taille de la pile peut en effet être illimité. _STK_LIM
est la valeur par défaut , _STK_LIM_MAX
est quelque chose qui diffère selon l'architecture, comme on peut le voir à partir de include/asm-generic/resource.h
:
/*
* RLIMIT_STACK default maximum - some architectures override it:
*/
#ifndef _STK_LIM_MAX
# define _STK_LIM_MAX RLIM_INFINITY
#endif
Comme on peut le voir dans cet exemple, la valeur générique est infinie, où RLIM_INFINITY
est, encore une fois, dans le cas générique défini comme :
/*
* SuS says limits have to be unsigned.
* Which makes a ton more sense anyway.
*
* Some architectures override this (for compatibility reasons):
*/
#ifndef RLIM_INFINITY
# define RLIM_INFINITY (~0UL)
#endif
Donc je suppose que la vraie réponse est - la taille de la pile PEUT être limitée par une architecture, alors une trace de pile illimitée signifiera n'importe quoi _STK_LIM_MAX
est défini à, et dans le cas où c'est l'infini - c'est infini. Pour plus de détails sur ce que cela signifie de le définir sur infini et quelles implications cela pourrait avoir, reportez-vous à l'autre réponse, c'est bien mieux que la mienne.