Macos 为什么Mac ABI要求x86-32的16字节堆栈对齐?
我可以理解旧的PPC RISC系统甚至x86-64的这一要求,但对于久经考验的真正的x86?在这种情况下,堆栈只需在4字节边界上对齐。是的,某些MMX/SSE指令需要16字节对齐,但如果这是被调用方的要求,则应确保对齐正确。为什么每一个来电者都有这个额外的要求?这实际上会导致性能下降,因为每个呼叫站点都必须管理此需求。我错过什么了吗 更新:经过进一步调查,并咨询了一些内部同事,我对此有了一些理论:Macos 为什么Mac ABI要求x86-32的16字节堆栈对齐?,macos,memory-alignment,callstack,calling-convention,abi,Macos,Memory Alignment,Callstack,Calling Convention,Abi,我可以理解旧的PPC RISC系统甚至x86-64的这一要求,但对于久经考验的真正的x86?在这种情况下,堆栈只需在4字节边界上对齐。是的,某些MMX/SSE指令需要16字节对齐,但如果这是被调用方的要求,则应确保对齐正确。为什么每一个来电者都有这个额外的要求?这实际上会导致性能下降,因为每个呼叫站点都必须管理此需求。我错过什么了吗 更新:经过进一步调查,并咨询了一些内部同事,我对此有了一些理论: 操作系统的PPC、x86和x64版本之间的一致性 似乎GCC codegen现在一致地执行子esp
虽然我无法回答您的问题,但您可能会发现以下网站上的手册很有用: 关于ABI,请特别关注:
希望有用。这是一个效率问题 确保堆栈在使用新SSE指令的每个函数中都是16字节对齐的,这会增加使用这些指令的大量开销,从而有效地降低性能 另一方面,始终保持堆栈16字节对齐可以确保可以自由使用SSE指令,而不会造成性能损失。这是没有成本的(成本至少在说明书中衡量)。它只涉及在函数的序言中更改一个常量
浪费堆栈空间很便宜,它可能是缓存中最热门的部分。首先,请注意,16字节对齐是Apple在System V IA-32 ABI中引入的一个例外 只有在调用系统函数时才需要堆栈对齐,因为许多系统库使用SSE或Altivec扩展,它们需要16字节对齐。我在文档中找到了一个明确的引用 您可以按照您想要的方式完美地处理堆栈帧,但是如果您尝试使用未对齐的堆栈调用系统函数,您将得到一条未对齐的堆栈错误消息 编辑:
作为记录,使用GCC编译时,您可以通过使用该选项来避免对齐问题。我的猜测是,苹果相信每个人都只使用XCode(GCC)来为您对齐堆栈。因此,要求堆栈对齐以使内核不必对齐只是一种微观优化。不确定为什么没有人考虑过从基于传统PowerPC的平台轻松移植的可能性 请阅读以下内容: 然后放大到“32位PowerPC函数调用约定”,最后是: “这些是32位处理器中可用的嵌入对齐模式 PowerPC