Warum wird RAX vor dem Tail Call auf den Stapel geschoben?
Die Assembly-Ausgabe für die Funktion f unter Verwendung eines std::function-Arguments zeigt Ein faszinierender Vorgang: Unmittelbar vor dem Tail Call wird RAX auf den Stapel gelegt. Dieses Verhalten wird bei einem einfachen Tail-Call ohne den std::function-Wrapper nicht beobachtet.
Ausrichtungsüberlegungen
Der Grund für das Pushen von RAX liegt in der 64-Bit-Version ABI, das erfordert, dass der Stapel vor einem Aufrufbefehl auf 16 Byte ausgerichtet wird. Der Aufrufbefehl schiebt eine 8-Byte-Rücksprungadresse auf den Stapel und verletzt damit die Ausrichtung. Um dies zu beheben, muss der Compiler den Stapel vor dem Endaufruf auf ein Vielfaches von 16 Bytes neu ausrichten.
Effiziente Stapelausrichtung
Einen Don-Treue-Wert übertragen wie RAX ist eine effiziente Möglichkeit, eine Stapelausrichtung zu erreichen, weil:
Durch das Drücken von RAX erfüllt der Compiler die Ausrichtungsanforderung ohne das Verhalten der Funktion zu stören.
Das obige ist der detaillierte Inhalt vonWarum wird RAX vor einem Tail Call mit einer „std::function' auf den Stack geschoben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!