La taille de la pile peut-elle être modifiée dynamiquement en C?La taille de la pile peut-elle être changée dynamiquement - Comment?
Si oui, comment?
La taille de la pile peut-elle être modifiée dynamiquement en C?La taille de la pile peut-elle être changée dynamiquement - Comment?
Si oui, comment?
Pourquoi avez-vous besoin de faire cela? Cela dépend du système d'exploitation et ce n'est pas quelque chose dans lequel C lui-même est directement impliqué (bien que les linkers spécifiques et les environnements d'exécution aient différentes manières de gérer la configuration de telles choses).
Quel OS avez-vous, et qu'essayez-vous d'atteindre?
c'est le genre de réponse que je déteste: «pourquoi quelqu'un ferait-il ça? Si vous n'avez pas de réponse, gardez le silence. Il a probablement des raisons de demander. J'ai effectivement eu le même problème. La réponse est bien sûr: google rlimit. Et je n'ai toujours pas de réponse pour Windows ... Maintenant, pour répondre à votre question: que se passe-t-il s'il doit implémenter un environnement de développement interactif, ou un interprète de langage, où un utilisateur peut entrer un script arbitraire à exécuter.Si le script a besoin de beaucoup de pile (une récursive), le système d'exécution devrait supporter cela (attraper le stack-overflow, changer la limite et continuer) - pas vrai? – blabla999
@ blabla999: Je suis toujours heureux d'avoir une downvote avec une explication, esp un bon profond. À la réflexion, cette «question de sondage» aurait dû être un commentaire. Cela dit, en termes de contenu de l'information, c'est la réponse de ~ = @ kotlinski que vous Meh'd. L'essentiel est que j'essayais d'aider le processus - parfois je le fais en votant et en ajoutant "cmon, plus de détails" dans les commentaires de la question, parfois je le fais en donnant la moitié de la réponse et passer à autre chose. Mais j'apprécie que vous ayez des fondements solides pour votre position et que vous en fassiez un plus gros effort pour faire des commentaires par défaut –
Voulez-vous modifier dynamiquement la taille de la pile pendant que le code est en cours d'exécution? AFAIK, cela ne peut pas être fait. Mais, vous pouvez définir la taille de la pile avant d'exécuter votre application. Vous pouvez le faire en utilisant la commande "ulimit -s" dans Linux qui va définir la taille de la pile pour tous les processus exécutés sous ce shell. En cas de fenêtres, la même chose peut être faite dans VC6 pour ce projet en définissant la taille de la pile dans Propriétés du projet -> options de lien -> sortie -> allocations de pile -> réserve. Je ne suis pas au courant pour VC8, mais de telles options pourraient être disponibles.
En général, c'est quelque chose qui ne peut pas être fait de manière robuste, car l'espace d'adressage doit être réservé à la pile. Si des objets ont déjà été alloués sur le tas avec des adresses dans la nouvelle plage de piles souhaitée, vous aurez de gros problèmes. Sur des systèmes avec moins de mémoire que l'espace d'adressage, cela pourrait être possible, mais je doute que vous verrez de nombreux systèmes qui le permettent. C n'exige ni ne supporte de tels mécanismes pour cela.
Non, cela ne relève pas du champ d'application de C.
Cela dépend de l'OS que vous utilisez. Sous Unix/Linux, vous pouvez utiliser POSIX syscall setrlimit()
pour les ressources RLIMIT_STACK
. Pour plus de détails, voir .
Dans un programme monothread sous Linux, la pile va se développer automatiquement jusqu'à ce qu'elle se bloque dans quelque chose d'autre dans l'espace mémoire. C'est généralement le tas et sur les systèmes 32 bits cela signifie que vous pouvez généralement avoir plusieurs Go de pile.
Dans un programme multithread, cela n'est généralement pas possible car la pile d'un autre thread sera gênante.
Vous pouvez contrôler la taille de la pile lors de la création d'un nouveau thread, mais c'est généralement une mauvaise idée car elle dépend de l'architecture de la quantité de pile requise par une tâche.
Ce sont des choses de très bas niveau et principalement contrôlées par votre bibliothèque C/bibliothèque de thread. Mess autour à vos risques et périls :)
Techniquement, avec de la mémoire virtuelle, il devrait être possible de déplacer les choses pour faire de la pile. Ainsi, même les programmes multithread pourraient avoir des piles dynamiques si cela était supporté. – doc
Je ne suis pas sûr de comprendre votre question. Appeler une fonction ou entrer un bloc avec une variable locale étend la pile, mais il semble peu probable que ce soit la réponse que vous recherchez. – AProgrammer
une petite note: utilisez 'alloca()' pour obtenir de l'espace sur le stacj actuel dans la fonction en cours. (@AProgrammer) – imacake