Zug grosse Stackreservierungen



  • Hi Leute

    Nach vielen Tutorials in fremden, unverständlichen Sprachen (englisch) habe ich immer noch nicht verstanden warum die Stackreservierung für Lokale Variablen und für die 4 Registerparamete (home Space) der nächsten Funktion, immer zu gross ist. Klar ist, dass der Stack Pointer auf 16 bit ausgerichtet sein soll. Aber ist es weil am Anfang der Funktion der stack pointer wegen der Rücksprungsadresse nicht auf 16 bit ausgerichtet ist ?
    Oder weil der Compiler die Lokalen Variablen heimlich umsortiert damit alle auf 16 bit ausgerichtet sind und er dafür extra Platz braucht?
    Im Fall 1 habe ich es verstanden. Im Fall 2 nicht.
    In einem Tutorial wird 16 zuviel reserviert, was macht das für einen Sinn? Es sollten doch 8 zuviel sein oder ?



  • Zunächst macht der Programmierer das, weil es in ABI's und Calling Conventions so vorgeschrieben ist. Eine Funktion darf sich darauf verlassen, dass der Stack in einer bestimmten Weise ausgerichtet ist, wenn sie aufgerufen wird. Und wenn da "16 Byte" (Byte! Nicht Bit!) steht, dann sind es eben 16 Byte 😉

    Zweiter Grund ist die Schnelligkeit des Speicherzugriff. Heutige Prozessoren holen sich gleich ein ganzes Bündel an Bytes aus ausgerichteten Adressen. Wenn die Adressen nicht geschickt ausgerichtet sind, dann kann es sein, dass der Prozessor zwei Bündel holen muss und sie umständlich zusammensetzen muss. Dasselbe Spiel mit dem Cache. Auch deswegen die heimliche Umsortiererei. Manchmal werden sogar in den Programmfluss sinnlose Befehle eingefügt, um die nächste Schleife an einer ausgerichteten Adresse beginnen zu lassen.

    Dritter Grund ist, dass SSE-Werte an Adressen zu stehen haben, die durch 16 teilbar sind, sonst wirft der Prozessor eine Ausnahme.

    Vierter Grund ist die Faulheit. Mit 16 bist Du immer auf der richtigen Seite. Bei heutigen Speichergrößen macht es nichts aus, wenn da mal 8 oder gar 15 Byte zu viel reserviert werden.

    viele grüße
    ralph


Anmelden zum Antworten