尾呼叫情況下的堆疊對齊
問題是為什麼在產生的彙編程式碼中先將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中文網其他相關文章!