这篇文章基于上一篇,解决了自定义内存分配器中的内存碎片。 核心问题是,反复分配和释放小块会在内存中产生许多小的,无法使用的差距,即使存在足够的总自由空间,也可以防止更大的分配。 本文详细介绍了一个解决方案:合并相邻的自由块。
问题:内存片段
作者用代码示例和图表说明了碎片。 小额分配,然后进行交易,留下了零散的自由空间。 随后的较大分配失败了,因为即使合并的自由空间超过了请求,也没有单个自由块足够大。 这些图在视觉上证明了这个问题,显示了较小的,释放的块如何阻止较大的自由区域的有效重复使用。
>解决方案:合并相邻的自由块
>>解决方案涉及合并相邻的自由块以创建更大的可用内存块。 作者对代码进行了重新分配以提高可读性和重复使用,并引入了几个辅助功能:
header_user_area(Header *header)
header_address_after_block(Header *header)
>
header_previous_available(Header *header)
>
header_next_available(Header *header)
>
,是解决方案的核心。 它标识相邻的自由块并将其合并,并相应地更新大小和指针。 该函数处理边缘案例,例如合并最后一个块。header_merge(Header *header)
将解决方案集成到abfree()
>>中
在释放内存之前,对
>abfree()
结论和下一步header_merge()
改进的abfree()
函数以及辅助功能可显着降低记忆碎片。 作者指出,最后一个挑战仍然存在:内存块对齐,将在下一篇文章中解决。 在文章的末尾提供了完整的,更新的abfree()
函数及其支持功能。
以上是实施malloc()和free() - 合并小块的详细内容。更多信息请关注PHP中文网其他相关文章!