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

jin*_*nge 3 sse simd alignment memory-alignment stack-frame

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

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

Zby*_*000 5

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

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

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