Alignment 为什么堆栈帧是16字节长的倍数?

Alignment 为什么堆栈帧是16字节长的倍数?,alignment,sse,stack-frame,Alignment,Sse,Stack Frame,CSAPP解释说,SSE指令在16字节的数据块上运行,它需要内存地址为16的倍数 但与堆栈帧有什么关系?这是否意味着SSE指令在堆栈帧上运行?如果是,常用的指令是什么 非常感谢。是的,堆栈帧的对齐设置使得任何指令都可以处理任何可能存储在堆栈帧中的数据类型 例如,在x86/x86_64上,有SSE指令假设内存地址与16字节对齐。然后,编译器假设堆栈帧是16字节对齐的,这样它就可以安排本地变量,如果需要的话,它们也会对齐。SSE指令(与任何其他指令一样)可以在任何内存上运行,包括全局、堆或堆栈 堆的

CSAPP解释说,SSE指令在16字节的数据块上运行,它需要内存地址为16的倍数

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


非常感谢。

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

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


堆的实际情况也是如此——当分配长度大于16(或等于16)的结构时,malloc/new必须返回16字节对齐的地址,这样这种指令才能使用它。

哇,我明白了,多亏了你的回答。简单地说,这是因为如果堆栈帧不对齐,那么其中的数据将永远不会对齐,对吗?所以堆栈帧提供了一个对齐的基线。