2009-05-21 5 views
0

Duplizieren von How to allow more memory and avoid stack overflow on lots of recursion?Wie kann ich den Stapelspeicher erhöhen?

Ich schreibe einen Zweig und gebundenen Algorithmus, der mindestens 10000 Ebene durch eine rekursive Funktion hat, aber es funktioniert nicht wegen eines Stapelüberlauffehler. Hier ist eine einfache Instanz meines Programms in C++:

void f(int k) 
{ 
    if(k==10000) return; 
    f(k+1); 
} 

void main() 
{ 
    f(1); 
    return; 
} 

könnte jemand helfen?

+1

Welches Betriebssystem? – sharptooth

+0

Siehe diese eng verwandte Frage http://stackoverflow.com/questions/743545/how-to-allow-more-memory-and-avoid-stack-overflow-on-lots-of-recursion – sharptooth

+1

welcher Compiler? –

Antwort

4

Dies ist ein Linker-Problem. Sie müssen dem Linker mitteilen, dass die dem Stack zugewiesene Speichermenge erhöht werden soll. Dies ist für verschiedene Sprachen und Compiler unterschiedlich. Dies kann ein Befehlszeilenparameter oder eine Konfigurationsdatei sein oder sogar im Quellcode angegeben werden.

0

Jeder rekursive Algorithmus kann mithilfe einer Liste als nicht rekursiver Algorithmus umgeschrieben werden. Auf diese Weise haben Sie das Problem von der Stapelgröße zur Heap-Größe verschoben, wobei Heaps in der Regel (viel) größer sind als Thread-Stacks. Es gibt auch Stack-Größe Linker-Flags, hängt von Ihrem Compiler/Linker und Plattform

0

oder Sie könnten die Rekursion in eine Interaktion umschreiben.

2

Wenn Sie Linux verwenden (vielleicht auch Macs?), Können Sie den Befehl ulimit verwenden.

Aber Sie möchten vielleicht in die Optimierung Ihres Algorithmus oder Blick in Tail-Rekursion schauen.

0

Neben Ihrer Hauptfrage könnten Sie Valgrind und sein Werkzeug Massif verwenden, um Ihren Stack-Speicher zu profilieren (standardmäßig Massif profiles heap, aber auch profile stack, wenn eine Option aktiviert ist).

0

Wenn Sie _beginthreadex verwenden, können Sie die Stapelgröße angeben. Ich glaube, der Standardwert ist 1 MB. Sie können einen neuen Thread ausarbeiten, um Ihre Arbeit zu erledigen und die gewünschte Stapelgröße angeben.