首頁 >後端開發 >C++ >為什麼在使用 `std::function` 進行尾呼叫之前將 RAX 壓入堆疊?

為什麼在使用 `std::function` 進行尾呼叫之前將 RAX 壓入堆疊?

Susan Sarandon
Susan Sarandon原創
2024-12-13 01:11:16176瀏覽

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

為什麼 RAX 在尾部呼叫之前被推入堆疊?

採用 std::function 參數的函數 f 的彙編輸出揭示了一個有趣的操作:在尾呼叫之前,RAX 被壓入堆疊。在沒有 std::function 包裝器的簡單尾呼叫中不會觀察到此行為。

對齊注意事項

推送 RAX 的原因植根於 64 位元ABI,要求在呼叫指令之前將堆疊對齊到 16 位元組。呼叫指令將 8 位元組傳回位址壓入堆疊,違反了對齊方式。為了修正這個問題,編譯器必須在尾部呼叫之前將堆疊重新對齊為 16 位元組的倍數。

高效堆疊對齊

推送無關值像RAX 一樣是實現堆疊對齊的有效方法,因為:

  • 某些CPU 上的堆疊引擎可以與sub rsp, 8 相比,優化操作。
  • 推送到堆疊的值是無關緊要的,因為它不在函數內使用。

透過推送 RAX,編譯器滿足對齊要求而不破壞函數的行為。

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

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