Set Stack Size (Stack Overflow)
-
Hallo!
Betrachte folgendes Programm, compiliert im .NET 2003 Framework. Die Funktion recurs(int n) wird immer wieder (rekursiv) aufgerufen bis ein Stack Overflow behandelt werden muss.
#include <windows.h> #include <stdio.h> int count=1; //Globaler Zähler void recurs(int n) { count=count+1; n=n+1; recurs(n); } int main(void) { __try { recurs(42); } __except (EXCEPTION_EXECUTE_HANDLER) { //Wieviel mal wurde die Funktion recurs() aufgrufen. printf("Stack Overflow. Count=%d\n",count); } return 0; }
Beim Stack Overflow hat die Variable count den Wert 4796.
Meine Frage ist: Wie kann man den Stack vergrößern?
Laut http://windowssdk.msdn.microsoft.com/en-us/library/tdkhxaks.aspx
kann die Stackgröße mit /F (Set Stack Size) in den Compileroptionen gesetzt werden. (Rechtsklick Projekt->Eigenschaften Konfigurationseigenschaften->C/C++->Befehlszeile Zusätzliche Optionen)Oder man benutzt die Option /STACK im Linker, siehe http://msdn2.microsoft.com/de-de/library/8cxs58a6.aspx. Oder beides?
Ich benutzte das .NET Framework 2003 mit 1GB Ram. Folgende Befehlszeilen haben nicht funktioniert:
Compiler Linker
/F"666666"
/F 666666
/F"666666" /STACK:666666
/F"666666" /STACK:"666666"
/F 666666 /STACK:666666
/F 666666 /STACK:"666666"
/STACK:666666
/STACK:"666666"Wie vergrößer ich also den Stack?
-
Deniz schrieb:
Wie vergrößer ich also den Stack?
Ich kenne das nur im Zusammenhang mit Microsoft Visual C++... probiers einfach mal, vielleicht isses unter dem Framework gleich
Wenn man mit Microsoft Visual C++ arbeitet, kann man mit dem Compilierparameter /F festlegen, wie groß der Stack sein soll. Standardmäßig beträgt die Größe 1 MB. Die Anweisung /F0x1000 zum Beispiel legt die Stackgröße auf 4 kB fest (= 4096 Bytes, eben 0x1000 hexadezimal). Wichtig dabei ist, daß nur vielfache von 4096 Bytes (also vielfache von 0x1000) vom Compiler akzeptiert werden, die sogenannte PAGESIZE. Gibt man andere Werte an, wird auf das nächste Vielfache aufgerundet. In Visual Studio 6 zum Beispiel erreicht man diese Einstellung auch über "Project Settings / Link / Stack allocations / Reserve".
Nein eine Option sollte reichen...
-
Danke für Deine Antwort.
Mit /STACK:66666666 funktioniert es jetzt (count=308810).