Stackframes ??



  • Hallo !!

    Ich hab da mal ne Frage:

    Viele Compiler bieten die Möglichkeit Programme ohne "Frame Pointer" zu erstellen.
    Kann mir evtl. jemand in verständlicher Weisse erklären was das heisst und ob es sicher ist, bzw ob es die Geschwindigkeit signifikant erhöht??

    Schönen Dank!



  • Noch immer interessiert? (wenn nicht, mach ich mir nicht die Mühe, da jetzt eine lange Antwort zu schreiben)



  • http://www.fefe.de/devel/profiling.txt

    fefe schrieb:

    $ gcc -fomit-frame-pointer

    Diese Option sagt gcc, daß er keinen Frame Pointer benutzen soll. Der
    Frame Pointer ist ein Register, das den Stack adressiert. Es gibt einen
    Stack Pointer und einen Frame Pointer. Der Stack Pointer zeigt aufs
    Ende des Stacks. Der Frame Pointer gleicht dem Stack Pointer, außer man
    hat lokale Variablen definiert. Nun weiß der Compiler, wie viel Platz
    lokale Variablen so belegen (nur alloca wird etwas schwierig), d.h. der
    Frame Pointer ist nicht direkt essentiell und kann auch für andere
    Aufgaben benutzt werden. Der Haupteffekt vom Weglassen des Frame
    Pointers ist, daß der Code etwas kompakter wird. Deutlich schneller
    wird er eigentlich nicht. Und man kann den Code nicht mehr debuggen.
    Für Release-Versionen unserer Software ist diese Option durchaus
    angebracht.



  • Mit DWARF2-Unterstützung sollte das Debuggen allerdings wieder funktionieren. Unter Windows geht's schon lang (FPO).



  • Ja, geht wohl mittlerweile auch. Der Text ist aber schon älter.



  • Der Frame Pointer gleicht dem Stack Pointer, außer man hat lokale Variablen definiert

    Noch etwas dazu:
    Ohne Frame Pointer werden Parameter und lokale Variablen relativ zum stack pointer (ESP) adressiert - und der "wandert" halt, je nach im aktuellen Block definierten lokalen Variablen. Mit Stack Frame wird der originale ESP in EBP (üblicherweise) gemerkt, alle Adressierungen laufen relativ zu EBP, Rücksprungadresse und Parameter liegen dann oberhalb, lokale parameter unterhalb von EBP. Dadurch wird das Assembly eher lesbar + debugbar.

    Mit Stackframe:
    - release - Version einfacher debugbar
    - zwei Register-mov - befehle pro Funktion mehr (ist nur bei wirklich winzigen Funktionen überhaupt merklich, und als Bottleneck kaum vorstellbar)
    - ein freies Register weniger für andere Operationen (ist auf modernen Prozessoren fast egal)
    - die meisten Stack Trace Tools funktionieren tatsächlich 🙂

    @RingDing: was macht Dwarf2?



  • peterchen schrieb:

    - ein freies Register weniger für andere Operationen (ist auf modernen Prozessoren fast egal)

    Das würde ich nicht sagen. Nachdem x86 extrem wenige Register hat, macht das schon einen ziemlich großen Unterschied.

    Zu DWARF2: So wie ich das verstehe, ist das eine Art Bytecode, der vom Compiler erzeugt und vom Debugger ausgeführt wird und es irgendwie ermöglicht, an den Framepointer heranzukommen, wenn es ihn physisch (in Form eines Registers) nicht gibt.



  • @RingDing:
    neumodische Prozessoren verwenden Schattenregister und register renaming.

    [edit] Das hilft natürlich nur gegen Register Stalls und nicht gegen die (bereits vom Compiler erzeugten) direkten Speicherzugriffe. Also hast Du recht 🤡 (Warum fällt mir sowas imemr erst nach dem "Absenden" ein...) [/edit]


Anmelden zum Antworten