为什么 RAX 在尾部调用之前被推入堆栈?
采用 std::function 参数的函数 f 的汇编输出揭示了一个有趣的操作:在尾调用之前,RAX 被压入堆栈。在没有 std::function 包装器的简单尾调用中不会观察到此行为。
对齐注意事项
推送 RAX 的原因植根于 64 位ABI,要求在调用指令之前将堆栈对齐到 16 字节。调用指令将 8 字节返回地址压入堆栈,违反了对齐方式。为了纠正这个问题,编译器必须在尾部调用之前将堆栈重新对齐为 16 字节的倍数。
高效堆栈对齐
推送无关值像 RAX 一样是实现堆栈对齐的有效方法,因为:
通过推送 RAX,编译器满足对齐要求而不破坏函数的行为。
以上是为什么在使用 `std::function` 进行尾调用之前将 RAX 压入堆栈?的详细内容。更多信息请关注PHP中文网其他相关文章!