GNU文档指出 malloc
在 64 位系统上与 16 字节的倍数对齐。这是为什么?
如果我的理解是正确的,寄存器和所有指令都对最大 8 字节宽的值进行操作。因此,似乎需要 8 字节对齐。
注意事项:
- I've found some justification for why the stack pointer has to be 16-byte aligned but not other memory addresses
- 我看到一些评论者说这只是为了减少内部碎片,这没有多大意义,因为文档指出他们专门针对
x86_64
最佳答案
x86_64 使用 xmm 寄存器(大量使用 -- 所有 fp 内容都在 xmm 寄存器中完成,因为 8087 fp 寄存器已弃用),并且 xmm 寄存器需要 16 字节对齐才能(高效)访问。
所以 x86_64 中的大多数东西(包括由 malloc 分配的堆栈和堆)都被组织为始终 16 字节对齐,因此编译器在涉及 xmm 寄存器时总是可以自由使用“对齐”指令,而不需要使用(可能较慢)未对齐的指令。
在较新的硬件上,编译器甚至不需要麻烦使用对齐指令——当内存对齐时,未对齐指令与对齐指令一样快。
关于c - 为什么 malloc 是 16 字节对齐的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70692795/