结构内存对齐 - 编译时间与动态分配的内存

时间:2012-06-25 17:24:59

标签: memory-management glibc libc memory-alignment

当我遇到这个声明时,我只是通过glibc手册来了解 posix_memalign 函数的描述:

  

GNU系统中malloc或realloc返回的块的地址始终为a   8个中的多个(或64位系统上的16个)。如果你需要一个地址为a的块   使用memalign,posix_memalign或valloc的倍数高于2的倍数。

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

struct Mystruct
{
 int member;
};

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

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

1 个答案:

答案 0 :(得分:0)

值得记住的一点是,malloc()并不神奇 - 它只是一个功能。同样,堆只是一堆内存,编译器承诺不会触及它的内容。静态地(在堆栈上或在data / bss中)分配事物是编译器所做的事情,因此它可以将它们与指定的任何对齐对齐。 malloc()(以及相关的函数)是管理堆的函数,但它们在运行时被调用。编译器对malloc()一无所知,除了它是一个函数,而malloc()对你要求它分配的内存一无所知,除了你要求多少。由于16位对齐通常适用于大多数常见用途,因此malloc()可确保此对齐安全。

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