0

当我遇到以下语句时,我正在阅读 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 个)?

4

1 回答 1

0

值得记住的一件事是 malloc() 没有什么神奇之处——它只是一个函数。同样,堆只是一堆内存,编译器承诺不会触碰它的东西。静态分配事物(在堆栈上或在 data/bss 中)是编译器所做的事情,因此它可以将它们与指定的任何对齐方式对齐。malloc() (和相关函数)是管理堆的函数,但它们在运行时被调用。编译器对 malloc() 的任何信息一无所知,除了它是一个函数,而 malloc() 对您要求它分配的内存一无所知,除非您要求多少。因为 16 位对齐通常适用于大多数常见用途,所以 malloc() 确保这种对齐是安全的。

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

于 2012-06-26T00:19:14.917 回答