我理解对于旧的PPC RISC系统和x86-64,这个要求是可以理解的,但对于老牌的x86系统呢?在这种情况下,堆栈只需要按4字节边界对齐即可。是的,一些MMX/SSE指令需要16字节对齐,但如果调用方有此要求,则应确保对齐正确。为什么要给每个调用者加上这个额外的要求呢?这实际上可能会导致一些性能下降,因为每个调用点都必须管理此要求。我有什么遗漏的吗?
更新:在进一步调查和与内部同事的咨询后,我有一些关于这个问题的理论:
- PPC、x86和x64版本的操作系统之间的一致性
- 现在看来,GCC代码生成器现在一致地进行sub esp,xxx然后将数据“mov”到堆栈上,而不是简单地执行“push”指令。这实际上在某些硬件上可能更快。
- 虽然这确实让调用点变得有点复杂,但在使用默认的“cdecl”约定时,几乎没有额外开销,因为调用方清理堆栈。
我对最后一项的问题是,对于依赖于被调用方清理堆栈的调用约定,上述要求会使代码生成变得非常丑陋。例如,如果某个编译器决定为其自己的内部使用(即任何不打算从其他语言或来源调用的代码)实现更快速的基于寄存器的调用风格,那么这个堆栈对齐问题可能会抵消通过寄存器传递某些参数所实现的性能增益。
更新: 到目前为止,唯一真正的答案是一致性,但对我来说,那是一个过于简单的答案。我在x86架构方面拥有超过20年的经验,如果真正的原因是一致性而不是性能或其他具体的原因,那么我尊敬地建议开发人员可能有点天真。他们忽略了近30年的工具和支持。特别是如果他们期望工具供应商在不必跳过几个看似不必要的障碍的情况下迅速轻松地为他们的平台适应其工具(也许不会……这是苹果……)。
我再给这个话题一天左右的时间,然后关闭它……