我可以理解旧 PPC RISC 系统甚至 x86-64 的这一要求,但对于久经考验的旧 x86?在这种情况下,堆栈只需要在 4 字节边界上对齐。是的,一些 MMX/SSE 指令需要 16 字节对齐,但如果这是被调用者的要求,那么它应该确保对齐正确。为什么要让每个调用者都负担这个额外的要求?这实际上会导致性能下降,因为每个呼叫站点都必须管理此要求。我错过了什么吗?
更新:在对此进行了更多调查并咨询了一些内部同事之后,我对此有一些理论:
- 操作系统的 PPC、x86 和 x64 版本之间的一致性
- 似乎 GCC 代码生成器现在始终执行 sub esp,xxx 然后将数据“移动”到堆栈上,而不是简单地执行“推送”指令。这实际上在某些硬件上可能更快。
- 虽然这确实使调用站点有点复杂,但在使用调用者清理堆栈的默认“cdecl”约定时几乎没有额外的开销。
我对最后一项的问题是,对于依赖于被调用方清理堆栈的调用约定,上述要求确实“丑化”了代码生成。例如,某些编译器决定实现更快的基于寄存器的调用样式以供其内部使用(即任何不打算从其他语言或源调用的代码)?这种堆栈对齐的事情可能会抵消通过在寄存器中传递一些参数所获得的一些性能提升。
更新:到目前为止,唯一真正的答案是一致性,但对我来说,这有点太容易了。我在 x86 架构方面拥有超过 20 年的经验,如果一致性,而不是性能或其他具体的东西,真的是原因,那么我恭敬地建议开发人员要求它有点天真。他们忽略了近三年的工具和支持。特别是如果他们希望工具供应商能够快速轻松地为他们的平台调整他们的工具(也许不是......它是苹果......),而不必跳过几个看似不必要的障碍。
我会在另一天左右给出这个话题然后关闭它......