為什麼 RAX 在尾部呼叫之前被推入堆疊?
採用 std::function 參數的函數 f 的彙編輸出揭示了一個有趣的操作:在尾呼叫之前,RAX 被壓入堆疊。在沒有 std::function 包裝器的簡單尾呼叫中不會觀察到此行為。
對齊注意事項
推送 RAX 的原因植根於 64 位元ABI,要求在呼叫指令之前將堆疊對齊到 16 位元組。呼叫指令將 8 位元組傳回位址壓入堆疊,違反了對齊方式。為了修正這個問題,編譯器必須在尾部呼叫之前將堆疊重新對齊為 16 位元組的倍數。
高效堆疊對齊
推送無關值像RAX 一樣是實現堆疊對齊的有效方法,因為:
透過推送 RAX,編譯器滿足對齊要求而不破壞函數的行為。
以上是為什麼在使用 `std::function` 進行尾呼叫之前將 RAX 壓入堆疊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!