Memory management 结构内存对齐-编译时与动态分配内存

Memory management 结构内存对齐-编译时与动态分配内存,memory-management,glibc,libc,memory-alignment,Memory Management,Glibc,Libc,Memory Alignment,我正在阅读glibc手册,了解有关posix_memalign函数的说明,这时我遇到了以下语句: GNU系统中malloc或realloc返回的块地址始终为 八个(或64位系统上的十六个)的倍数。如果您需要一个地址为 使用memalign、posix_memalign或valloc,以二次幂的倍数表示 如果我考虑一个包含int数据成员的简单结构: struct Mystruct { int member; }; 然后我可以看到Mystruct应该是4字节对齐的。但根据64位体系结构的libc

我正在阅读glibc手册,了解有关posix_memalign函数的说明,这时我遇到了以下语句:

GNU系统中malloc或realloc返回的块地址始终为 八个(或64位系统上的十六个)的倍数。如果您需要一个地址为 使用memalign、posix_memalign或valloc,以二次幂的倍数表示

如果我考虑一个包含int数据成员的简单结构:

struct Mystruct
{
 int member;
};
然后我可以看到Mystruct应该是4字节对齐的。但根据64位体系结构的libc手册,为这种结构动态分配内存将返回在16字节对齐的地址上分配的内存


如果我错了,请纠正我。在我看来,编译器似乎只对全局/静态/自动变量(数据、bss、堆栈)使用结构的自然对齐。但另一方面,为了在堆内存上分配相同的结构,malloc调用使用预定义的对齐方式(32位体系结构上为8,64位体系结构上为16)?

值得记住的一点是,malloc()并不是什么神奇的东西——它只是一个函数。类似地,堆只是一堆内存,编译器承诺不会对其内容进行修改。静态分配(在堆栈上或在data/bss中)是编译器所做的事情,因此它可以将它们与指定的任何对齐方式对齐。malloc()(以及相关函数)是管理堆的函数,但它们是在运行时调用的。编译器除了知道malloc()是一个函数外,对它一无所知,而malloc()除了要求分配多少内存外,对你要求它分配的内存一无所知。因为16位对齐通常适用于大多数常见用途,所以malloc()确保这种对齐是安全的

PS:一个有趣的(并且让人大开眼界的)练习是编写自己的malloc()实现