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

Why is stack frame a multiple of 16 bytes long?

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

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

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

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

对于堆来说实际上是一样的——当你分配长度超过 16(或等于)的结构时,malloc/new 必须 return 16 字节对齐的地址,以便这种指令可以使用它。