Hallo, ich habe eine Frage zu lokalen Variablen in Funktionen. Ich habe gesehen, dass der GCC sie in Register packt, wenn es paßt. Ist ja auch gut so. Nur wenn die Routine rekursiv aufgerufen wird, dann ist das schlecht. Ich habe schon versucht, die Info zu finden, es ist mir aber nicht gelungen. Wie kann ich erzwingen, dass die lokalen Variablen auf den Stack gelegt werden für solch einen Fall? Ist wahrscheinlich ganz einfach (wenn man es weiß :-)). Danke für die Info. 900ss
900ss D. wrote: > Nur wenn die Routine rekursiv aufgerufen wird, dann ist das > schlecht. Sicher? Meist ist es besser wenn keine Daten auf dem Stack landen, weil dann kein vollständiger Stackframe angelegt werden muss. Denn der dafür nötige Update vom Stackpointer ist bei AVRs etwas aufwendig.
Wenn jeder rekursiver Aufruf aber seine eigenen Daten benötigt? Wie soll das auseinander gehalten werden? Dafür ist es schlecht meine ich. Ist mir schon klar, dass das aufwendiger ist. Aber ich weiß keine andere Lösung.
Natürlich werden die Register am Anfang der Funktion auf dem Stack gesichert und am Ende wiederhergestellt. Bei einer rekursiven Funktion landen die Daten also quasi sowieso auf dem Stack, so allerdings per push und pop und nicht per Stackframe.
900ss D. wrote: > ich habe eine Frage zu lokalen Variablen in Funktionen. Ich habe > gesehen, dass der GCC sie in Register packt, wenn es paßt. Ist ja auch > gut so. Nur wenn die Routine rekursiv aufgerufen wird, dann ist das > schlecht. Warum soll das schlecht sein? Laß das mal den Compiler machen, der weiß schon, was er tut. C-Funktionen sind per default reentrant, wenn sie auf keine IO-Ressourcen zugreifen. Es gibt Register, die muß der Aufrufer sichern und andere, die muß der Aufgerufene sichern. Vielleicht kann der GCC sogar Rekursionen zu Schleifen optimieren. Rekursionen sind ja nur kompliziert geschriebene Schleifen. Peter
Hmmmm.... ich glaube ich muß da nochmal rüber nachdenken. Habe wahrscheinlich einen Gedankenfehler gemacht. Danke erstmal soweit. PS. Ist wohl noch zu früh für einen Montag Morgen.... gähn ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.