Was kommt beim Funktionsaufruf auf den Stack?
-
Moin Moin!
Ich hab folgenden Code mal auf WinXP mit dem gcc 3.4.4 (Standardkompilation, d.h. keine Optimierungen, kein Profiling, keine Debugging-Symbole) kompiliert und ausgeführt:#include <stdio.h> void f(int i) { printf("%d\n", i); fflush(stdout); f(i + 1); } int main(void) { f(0); }Der Code stürzt bei Aufruf Nr. 130.190 ab. Laut http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/thread_stack_size.asp Ist die Stackgroeße bei WinXP 1 MB.
Das würde bedeuten, dass pro Funktionsaufruf 8 Byte verwendet werden (130190 * 8 Byte = ~1017 KB). 4 Byte fuer den Parameter, und ich schaetz mal weitere 4 Byte fuer die Ruecksprungadresse. Nur: muesste nicht auch irgendwo auf dem Stack die Information stehen, wie gross der (fuer diese Funktion lokale) Stack eigetnlich ist? Sonst koennte doch der Stack nicht richtig abgebaut werden (wie kann der Computer wissen, dass er am Ende der Funktion die letzten 8 Byte vom Stack loeschen kann)?
-
Der Compiler, weiß daß er Code zum popen von 8 Byte generieren muß, weil er zuvor Code zum pushen von 8 Bytes generiert hat.
-
Z2 schrieb:
Der Compiler, weiß daß er Code zum popen von 8 Byte generieren muß, weil er zuvor Code zum pushen von 8 Bytes generiert hat.
*Mit Hand auf Stirn klatsch* da hätt ich auch selber draufkommen können
Thx 