2012-12-22 13 views
5

Ich möchte genaue Informationen über Stack-Überlauf in VC++ (32 Bit und 64 Bit) und speziell in Rekursion. Im Debug-Modus geschieht dies so schnell in Rekursion (wie 4500 Ausführen einer einfachen rekursiven Funktion nichts tun oder mögen). Es scheint jedoch, Release-Modus ist anders. Es war schwer zu verstehen, und ich habe es jetzt nicht getestet, weil die Optimierung den Code löscht, der nichts tut (anscheinend die Rekursion entfernt), weil mein Code oder meine Funktion so war .. Ich sollte mehr tun .. Ich messe die richtige Zeit in der optimierten Version, ich weiß nicht, ob Optimierung dasselbe in komplexeren schnellen Sortierung durch Rekursion implementiert tut?Wie groß ist der Stack in VC++?

Danke!

Antwort

7

Als Andreas Brinck states in his related answer:

in VC++ die Standard-Stack-Größe 1 MB ist glaube ich, so mit einer Rekursion Tiefe von 10.000 jeder Stapelrahmen maximal ~ 100 Bytes sein kann.

Projekt → Eigenschaften → Konfigurationseigenschaften → Linkers → System → Stapel Reserve Größe:

Diese Grenze Stack-Größe kann mit geändert werden.

Project → Properties → Configuration Properties → Linker → System → Stack Reserve Size.

+0

es funktionierte, danke, muss nach der Konfiguration neu erstellt werden. Danke! – user683595

+0

Gern geschehen !! Vergessen Sie nicht, die Antwort zu akzeptieren. Fröhliche Weihnachten!! –

+0

Erster Absatz kopiert wörtlich aus [C/C++ maximale Stapelgröße des Programms] (http://stackoverflow.com/q/1825964) –

0

Sie können jeden rekursiven Algorithmus iterativ zum Beispiel tun mit einem separaten Stapel.

1

Die Option für Stackgröße in VC++ zu befindet,

Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size. 
0

Während der Stapel Erhöhung nicht eine schreckliche Idee ist, ist stackspace nicht unendlich, und wie Sie wahrscheinlich bemerkt haben, läuft die Stapel ist nicht leicht wiederherstellbar. Wenn Sie rekursive Funktionen verwenden müssen, die mehrere tausend Ebenen recurse, dann erhöhen Sie auf jeden Fall den Stapel.

Aus Sicherheitsgründen, stellen Sie sicher, dass Sie die maximale sichere Rekursionsstufe testen und dann eine Einschränkung in Ihrer Funktion haben [sogar im Produktionscode, selbst wenn es ein wenig langsamer wird und möglicherweise mehr Speicherplatz belegt] . Andernfalls können Sie darauf wetten, dass jemand irgendwo Ihren Code in einer Weise verwendet, die Sie nicht vorausgesehen haben, und einen Absturz hat, wenn er ein paar Stufen tiefer in die Rekursion läuft, als Sie erwartet haben - kablam, keine mögliche Wiederherstellung.

Eine andere mögliche Lösung ist, Ihre Rekursion in einem separaten Thread auszuführen, und wenn dieser Thread abstürzt, haben Sie immer noch den Hauptthread, um sich von dem Absturz auf eine vernünftige Art und Weise zu erholen Code stürzte mit einem Stack fehl, und was die Umstände waren).

Ich würde sicherlich eine nicht-rekursive oder zumindest begrenzte Rekursionsebene bevorzugen und andere Mechanismen verwenden, wie zum Beispiel die dynamisch zugewiesene lifo-Datenstruktur, um aufzuzeichnen, wo wir sind.