关于堆内存中的块对齐

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 一个通过malloccallocrealloc 分配的内存块。

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

【讨论】:

以上是关于关于堆内存中的块对齐的主要内容,如果未能解决你的问题,请参考以下文章

关于内存类型中的堆

关于内存对齐

java中 关于常量池 栈内存 堆内存

栈内存和堆内存的区别

Java堆内存溢出模拟

.net 中的堆栈和堆内存分配