为什么堆栈帧长度为16个字节的倍数?

时间:2016-02-29 13:12:18

标签: alignment sse stackframe

CSAPP解释说,SSE指令对16字节数据块进行操作,并且需要存储器地址为16的倍数。

但是与堆栈框架的关系是什么?这是否意味着SSE指令在堆栈帧上运行?如果是这样,常用的说明是什么?

非常感谢。

1 个答案:

答案 0 :(得分:2)

是的,堆栈帧的对齐已设置,因此任何指令都可以处理您可能存储在堆栈帧中的任何数据类型。

因此,例如在x86 / x86_64上有SSE指令,假设内存地址与16个字节对齐。然后编译器假设堆栈帧对齐16个字节,因此如果需要,它可以排列它们对齐的局部变量。 SSE指令(与任何其他指令一样)可以在任何内存上运行,包括全局,堆或堆栈。

它实际上与堆相同 - 当您分配超过16(或相等)的结构时,malloc / new必须返回16字节对齐的地址,以便该类指令可以使用它。