web-dev-qa-db-fra.com

C / C ++ taille de pile maximale du programme

Je veux faire DFS sur un tableau de 100 X 100. (Dites que les éléments du tableau représentent les nœuds du graphe) Ainsi, dans le pire des cas, la profondeur des appels de fonction récursifs peut aller jusqu'à 10000, chaque appel prenant jusqu'à 20 octets. Alors, est-ce que cela est faisable, y a-t-il une possibilité de stackoverflow?

Quelle est la taille maximale de la pile en C/C++?

S'il vous plaît spécifier pour gcc pour les deux
1) cygwin sous Windows
2) Unix

Quelles sont les limites générales?

93
avd

Dans Visual Studio, la taille de pile par défaut est de 1 Mo, je pense. Ainsi, avec une profondeur de récursion de 10 000, chaque image de pile peut contenir au maximum environ 100 octets, ce qui devrait suffire pour un algorithme DFS.

La plupart des compilateurs, y compris Visual Studio, vous permettent de spécifier la taille de la pile. Sur certains types de Linux (tous?), La taille de la pile ne fait pas partie de l'exécutable, mais est une variable d'environnement dans le système d'exploitation. Vous pouvez alors vérifier la taille de la pile avec ulimit -s et définissez-la sur une nouvelle valeur avec par exemple ulimit -s 16384.

Voici un lien avec les tailles de pile par défaut pour gcc.

DFS sans récursivité:

std::stack<Node> dfs;
dfs.Push(start);
do {
    Node top = dfs.top();
    if (top is what we are looking for) {
       break;
    }
    dfs.pop();
    for (outgoing nodes from top) {
        dfs.Push(outgoing node);
    }
} while (!dfs.empty())
90
Andreas Brinck

les piles de fils sont souvent plus petites. Vous pouvez modifier la valeur par défaut au moment du lien ou également au moment de l'exécution. Pour référence, voici quelques valeurs par défaut:

  • glibc i386, x86_64 7,4 Mo
  • Tru64 5.1 5.2 MB
  • Cygwin 1.8 MB
  • Solaris 7..10 1 Mo
  • MacOS X 10.5 460 KB
  • AIX 5 98 KB
  • OpenBSD 4.0 64 Ko
  • HP-UX 11 16 Ko
41
pixelbeat

Cela dépend de la plate-forme, de la chaîne d'outils, de ulimit, des paramètres, etc. Il n'est pas du tout spécifié et de nombreuses propriétés statiques et dynamiques peuvent l'influencer.

14
DrPizza

Oui, il y a une possibilité de débordement de pile. Les normes C et C++ ne dictent pas des choses telles que la profondeur de la pile, elles constituent 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 de personnaliser la taille de la pile d'un processus, 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ée et 4K validée, mais cela peut être modifié lorsque vous liez le programme. Utilisez le --stack option de ld pour le faire.

4
paxdiablo

Je venais juste de manquer de pile au travail, c'était une base de données et quelques threads, le développeur précédent avait jeté un grand 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, elle 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 les tableaux sur la pile - en particulier dans les applications complexes et en particulier dans les threads, utilisez plutôt heap. C'est pour ça que c'est là;)

N'oubliez pas non plus qu'il ne risque pas d'échouer immédiatement lors de la déclaration de la pile, mais uniquement lors de l'accès. Mon hypothèse est 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 de l'utiliser, puis découvre que la pile n'y est pas.

Différents systèmes d'exploitation peuvent avoir différentes stratégies de déclaration de pile. S'il vous plaît laissez un commentaire si vous savez quelles sont ces politiques.

3
Owl

Je ne suis pas sûr de ce que vous entendez par faire une recherche en profondeur d'abord sur un tableau rectangulaire, mais je suppose que vous savez ce que vous faites.

Si la limite de pile pose un problème, vous devriez pouvoir convertir votre solution récursive en une solution itérative qui place les valeurs intermédiaires dans une pile allouée à partir du tas.

2
Dave Kirby