关于堆内存中的块对齐

About block alignment in heap memory

提问人:안태찬 提问时间:11/26/2020 最后编辑:trincot안태찬 更新时间:6/13/2021 访问量:284

问:

我正在学习学校作业,使 malloc() 函数实现。我有一个关于块对齐的问题。

释放的块有没有可能不是 8 字节的倍数?

当我在系统编程教科书中看到关于隐式列表实现的代码时,似乎代码只考虑分配块的对齐。 我对上面的问题很好奇。

c malloc 动态内存分配 堆内存

评论

1赞 David Ranieri 11/26/2020
malloc另一方面,在 64 位系统上返回 8 的地址倍数是未定义的行为。free(malloc(n) + something_different_to_0)
0赞 안태찬 11/26/2020
哦,我明白了

答:

1赞 Rachid K. 11/26/2020 #1

在 GLIBC 的分配器中,块的内部对齐方式为“2 x sizeof(size_t)”。在 32 位系统上,size_t为 4 个字节。在 64 位系统上,size_t为 8 字节。因此,对齐方式分别为 8 和 16 字节。

注意:如果您需要其他对齐方式,该服务提供 posix_memalign()。

1赞 Gerhardh 11/26/2020 #2

您只能使用通过 或 分配的内存块。freemalloccallocrealloc

如果确保这些函数始终提供与 8 个字节的倍数对齐的地址,则无需关心除此类地址之外的任何其他内容。任何试图释放未经授权的地址的人都将违反上述规则并导致未定义的行为。free