Heim >Backend-Entwicklung >C++ >Warum wird RAX vor einem Tail Call mit einer „std::function' auf den Stack geschoben?

Warum wird RAX vor einem Tail Call mit einer „std::function' auf den Stack geschoben?

Susan Sarandon
Susan SarandonOriginal
2024-12-13 01:11:16176Durchsuche

Why is RAX Pushed onto the Stack Before a Tail Call with a `std::function`?

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:

  • Stack-Engines auf einigen CPUs können die optimieren Operation im Vergleich zu Sub RSP, 8.
  • Der auf den Stapel übertragene Wert ist irrelevant, da er nicht innerhalb der Funktion verwendet wird.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn