首页 >后端开发 >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