提问人:안태찬 提问时间:11/26/2020 最后编辑:trincot안태찬 更新时间:6/13/2021 访问量:284
关于堆内存中的块对齐
About block alignment in heap memory
问:
我正在学习学校作业,使 malloc() 函数实现。我有一个关于块对齐的问题。
释放的块有没有可能不是 8 字节的倍数?
当我在系统编程教科书中看到关于隐式列表实现的代码时,似乎代码只考虑分配块的对齐。 我对上面的问题很好奇。
答:
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
您只能使用通过 或 分配的内存块。free
malloc
calloc
realloc
如果确保这些函数始终提供与 8 个字节的倍数对齐的地址,则无需关心除此类地址之外的任何其他内容。任何试图释放未经授权的地址的人都将违反上述规则并导致未定义的行为。free
评论
malloc
另一方面,在 64 位系统上返回 8 的地址倍数是未定义的行为。free(malloc(n) + something_different_to_0)