Deeem2031 hat geschrieben:Du musst eigentlich nur bei rekursiven Proceduren darauf achten das die früh genug aufhören. Ansonsten wirst du warscheinlich nie an die Grenzen des Stacks kommen.
Lokale Variablen belasten ja auch den Stack, also kann man
auch dort einsparen.
Der folgende Code crasht bei mir:
Code: Alles auswählen
#MYSIZE = 3047
Structure myStruct
long.l[#MYSIZE]
EndStructure
Procedure xyz()
a.myStruct
a\long[#MYSIZE-1] = 2
MessageRequester("INFO","Test")
EndProcedure
xyz()
Das Crasht hier allerdings ohne Exception und wird einfach
beendet ohne das die MessageBox kommt.
Allerdings sieht das nicht aus wie der Stacküberlauf den ich
eigentlich haben wollte, da der Stack 1MiB ist.
Hier gibt es dann die richtige Exception (Ausnahmefehler):
Code: Alles auswählen
Structure myStruct
long.l[250]
EndStructure
Procedure Rekursiv(a)
x.myStruct
If a = 1000
MessageRequester("INFO","a = "+Str(a))
Else
Rekursiv(a+1)
EndIf
EndProcedure
Rekursiv(0)
(Mit eingeschaltetem Debugger. Ohne Debugger kann man
die Werte ein bissl erhoehen, z.B. a = 2000)
Das geht also schneller als man denkt, wenn man nicht
darauf achtet oder man nicht weiß wie ein Rechner auf
unterster Ebene funktioniert (z.B. Beginner).
Der Stack ist standardmaessig bei den meisten Compilern
auf 1MiB eingestellt. Das kann aber meist ganz einfach durch
ein Linker-Flag geändert werden, wenn man bei tiefer Rekursion
usw. mal mehr braucht.
Als Tipp für Rekursion könnte man also sagen: So wenig
wie möglich lokale Variablen in der Rekursionsprozedur.
Lokale Variablen, wenn nötig, so klein wie möglich nehmen.
So wenig Argumente wie möglich an die Prozedur übergeben.
Rekursionstiefe so klein wie möglich.
Selbst ein rekursives Scannen aller Verzeichnisse auf einer
Festplatte kann schnell zum Stacküberlauf führen, wenn die
Tiefe groß genug ist und man noch lokale Variablen verwendet.
Das ist also ein Problem was Jedem schnell passieren kann,
wenn man das nicht im Hinterkopf hat. Selbst mit kleinsten
Codes geht das schnell.