当我遇到以下语句时,我正在阅读 glibc 手册以了解有关posix_memalign函数的描述:
在 GNU 系统中 malloc 或 realloc 返回的块的地址始终是 8 的倍数(或 64 位系统上的 16)。如果您需要一个地址是 2 的高次幂的倍数的块,请使用 memalign、posix_memalign 或 valloc。
如果我考虑一个只包含一个 int 数据成员的简单结构:
struct Mystruct
{
int member;
};
然后我可以看到 Mystruct 应该是 4 字节对齐的。但是根据 64 位架构的 libc 手册,为这种结构动态分配内存将返回分配在 16 字节对齐地址上的内存。
如果我错了,请纠正我。在我看来,编译器似乎只对全局/静态/自动变量(数据、bss、堆栈)使用结构的自然对齐。但另一方面,为了在堆内存上分配相同的结构,malloc 调用使用预定义的对齐方式(32 位架构上为 8 个,64 位架构上为 16 个)?