关于堆内存中的块对齐
Posted
技术标签:
【中文标题】关于堆内存中的块对齐【英文标题】:About block alignment in heap memory 【发布时间】:2021-03-09 02:40:26 【问题描述】:我正在学习使 malloc() 函数实现的学校作业。我有一个关于块对齐的问题。
是否有可能释放的块不是 8 字节的倍数?
当我看到系统编程教科书中关于隐式列表实现的代码时,似乎代码只考虑分配块的对齐。 我对上面的问题很好奇。
【问题讨论】:
malloc
在 64 位系统上返回 8 的地址倍数,另一方面,free(malloc(n) + something_different_to_0)
是未定义的行为。
哦我明白了
【参考方案1】:
在 GLIBC 的分配器中,块的内部对齐方式是“2 x sizeof(size_t)”。在 32 位系统上,size_t 是 4 个字节。在 64 位系统上,size_t 为 8 个字节。所以,对齐分别是 8 和 16 字节。
注意:如果您需要其他对齐方式,服务提供posix_memalign()。
【讨论】:
【参考方案2】:您只能free
一个通过malloc
、calloc
或realloc
分配的内存块。
如果您确保这些函数始终提供与 8 字节的倍数对齐的地址,那么您无需关心 free
ing 除了这样的地址之外的任何其他内容。试图释放未对齐地址的人将违反上述规则并导致未定义的行为。
【讨论】:
以上是关于关于堆内存中的块对齐的主要内容,如果未能解决你的问题,请参考以下文章