Je veux faire DFS sur un tableau 100 X 100. (Disons que les éléments du tableau représentent les nœuds du graphe) Donc, en supposant le pire des cas, la profondeur des appels de fonction récursifs peut aller jusqu'à 10000, chaque appel prenant jusqu'à 20 octets. Est-ce donc faisable signifie qu'il y a une possibilité de stackoverflow?
Quelle est la taille maximale de la pile en C / C ++?
Veuillez spécifier pour gcc pour les deux
1) cygwin sous Windows
2) Unix
Quelles sont les limites générales?
Réponses:
Dans Visual Studio, la taille de pile par défaut est de 1 Mo, je pense, donc avec une profondeur de récursivité de 10000, chaque frame de pile peut être au plus ~ 100 octets, ce qui devrait être suffisant pour un algorithme DFS.
La plupart des compilateurs, y compris Visual Studio, vous permettent de spécifier la taille de la pile. Sur certaines (toutes?) Saveurs Linux, la taille de la pile ne fait pas partie de l'exécutable mais d'une variable d'environnement dans le système d'exploitation. Vous pouvez ensuite vérifier la taille de la pile avec
ulimit -s
et la définir sur une nouvelle valeur avec par exempleulimit -s 16384
.Voici un lien avec les tailles de pile par défaut pour gcc.
DFS sans récursivité:
la source
les piles de fils sont souvent plus petites. Vous pouvez modifier la valeur par défaut au moment de la liaison ou la modifier également au moment de l'exécution. Pour référence, certains paramètres par défaut sont:
la source
Dépendant de la plate-forme, de la chaîne d'outils, de l'ultime limite, des paramètres ... Ce n'est pas du tout spécifié et de nombreuses propriétés statiques et dynamiques peuvent l'influencer.
la source
Oui, il existe une possibilité de débordement de pile. Les standards C et C ++ ne dictent pas des choses comme la profondeur de la pile, ce sont généralement un problème environnemental.
La plupart des environnements de développement et / ou des systèmes d'exploitation décents vous permettront d'adapter la taille de la pile d'un processus, que ce soit au moment de la liaison ou du chargement.
Vous devez spécifier le système d'exploitation et l'environnement de développement que vous utilisez pour une assistance plus ciblée.
Par exemple, sous Ubuntu Karmic Koala, la valeur par défaut pour gcc est 2M réservés et 4K validés, mais cela peut être modifié lorsque vous liez le programme. Utilisez l'
--stack
option deld
pour le faire.la source
Je viens de manquer de pile au travail, c'était une base de données et elle exécutait des threads, fondamentalement, le développeur précédent avait jeté un gros tableau sur la pile, et la pile était de toute façon faible. Le logiciel a été compilé à l'aide de Microsoft Visual Studio 2015.
Même si le thread était à court de pile, il échouait silencieusement et continuait, il ne débordait que lorsqu'il s'agissait d'accéder au contenu des données de la pile.
Le meilleur conseil que je puisse donner est de ne pas déclarer de tableaux sur la pile - en particulier dans les applications complexes et en particulier dans les threads, utilisez plutôt heap. C'est pour ça qu'il est là;)
Gardez également à l'esprit qu'il peut ne pas échouer immédiatement lors de la déclaration de la pile, mais uniquement lors de l'accès. Je suppose que le compilateur déclare la pile sous Windows "de manière optimiste", c'est-à-dire qu'il supposera que la pile a été déclarée et est suffisamment dimensionnée jusqu'à ce qu'il vienne à l'utiliser et découvre ensuite que la pile n'est pas là.
Différents systèmes d'exploitation peuvent avoir des stratégies de déclaration de pile différentes. Veuillez laisser un commentaire si vous connaissez ces politiques.
la source
Je ne suis pas sûr de ce que vous entendez en effectuant une première recherche en profondeur sur un tableau rectangulaire, mais je suppose que vous savez ce que vous faites.
Si la limite de pile est un problème, vous devriez être en mesure de convertir votre solution récursive en une solution itérative qui pousse les valeurs intermédiaires sur une pile qui est allouée à partir du tas.
la source