首頁 >後端開發 >C++ >為什麼在使用 std::function 進行尾呼叫期間將 RAX 暫存器壓入堆疊?

為什麼在使用 std::function 進行尾呼叫期間將 RAX 暫存器壓入堆疊?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-12 19:07:10310瀏覽

Why is the RAX Register Pushed onto the Stack During Tail Calls with std::function?

尾呼叫情況下的堆疊對齊

問題是為什麼在產生的彙編程式碼中先將RAX 暫存器壓入堆疊與std: :function 物件互動的C 程式碼。

必要性堆疊對齊

64 位元 ABI 要求在任何呼叫指令之前堆疊必須對齊到 16 個位元組。當進行呼叫時,它會將 8 位元組傳回位址壓入堆疊,從而破壞這種對齊方式。為了修正這個問題,編譯器必須在後續呼叫之前採取措施將堆疊重新對齊為 16 的倍數。

推送一個一次性值進行對齊

而不是執行「sub rsp, 8」推動「無關」值,例如RAX,事實證明在配備堆疊的CPU上效率更高引擎。這是因為簡單的推送指令通常需要比 sub rsp, 8 指令更少的處理器開銷。

與沒有std::function Wrapper 的Tailcall 比較

有時不存在std::function 包裝器,如「void g(void (*a)( ))」範例所示,尾部呼叫很簡單:一個簡單的跳躍(jmp)對目標函數的指令。堆疊對齊不需要額外的步驟,因為尾呼叫自然會保持正確的堆疊對齊。

以上是為什麼在使用 std::function 進行尾呼叫期間將 RAX 暫存器壓入堆疊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn