c - 为什么 malloc 是 16 字节对齐的?

标签 c memory x86-64 memory-alignment

GNU文档指出 malloc 在 64 位系统上与 16 字节的倍数对齐。这是为什么?

如果我的理解是正确的,寄存器和所有指令都对最大 8 字节宽的值进行操作。因此,似乎需要 8 字节对齐。

注意事项:

最佳答案

x86_64 使用 xmm 寄存器(大量使用 -- 所有 fp 内容都在 xmm 寄存器中完成,因为 8087 fp 寄存器已弃用),并且 xmm 寄存器需要 16 字节对齐才能(高效)访问。

所以 x86_64 中的大多数东西(包括由 malloc 分配的堆栈和堆)都被组织为始终 16 字节对齐,因此编译器在涉及 xmm 寄存器时总是可以自由使用“对齐”指令,而不需要使用(可能较慢)未对齐的指令。

在较新的硬件上,编译器甚至不需要麻烦使用对齐指令——当内存对齐时,未对齐指令与对齐指令一样快。

关于c - 为什么 malloc 是 16 字节对齐的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70692795/

相关文章:

c - GTK2:不推荐使用 g_thread_init

c - 将指针常量初始化为另一个指针常量内的字段?

c - 分配连续内存以包含具有灵活数组成员的多个结构

assembly - GCC 访问栈顶上方的内存

linux - NASM中临时变量中值的存储方式

c - 使用枚举作为参数的奇怪编译行为

javascript - 如何在 Emscripten 中返回未知大小的数组?

android - 如何强制 Android 调试的内存压力?

Java程序的内存使用情况不准确

c - 得到 unsigned long long 加法进位