假设malloc()分配的两个块在内部彼此相邻(谁知道它们彼此相邻?只是假设),在free()两个块之后,它们是否出现在一个未分配的块中?不确定,请帮忙。感谢。
答案 0 :(得分:12)
这完全取决于实施。有些分配器确实合并,有些分配器确实满足某些条件,有些则没有。但是,你不能以任何方式承担这一点。如果这是一个问题,请找到一个不依赖于这种假设的解决方案(例如,自己管理固定池)。
答案 1 :(得分:3)
这完全取决于分配器的实现。有many different个实施,some of which执行相邻空闲记忆的合并。
编辑:这是一个research paper,它描述了各种分配技术和基准测试对碎片的影响。我认为他们的结论是,地址排序的自由块列表(易于合并)表现得非常好。
答案 2 :(得分:2)
这(非常)依赖于实现。但是如果你想对它做些什么,它不是免费的()你应该看看malloc()。尽量不要分配许多小块。
答案 3 :(得分:1)
我认为通常使用的算法从不合并相邻内存。但是有些算法只要两个空闲块相邻但需要一些附加条件就不会这样做。两个例子:
根据所要求的大小使用不同内存区域的分配器(例如,对于小块大小使用特殊用途数据结构,以便它们具有较少的开销)通常不会为某些大小合并相邻块,即使它们使用更多其他尺寸的通用算法;
伙伴内存分配器只有在他们是伙伴时才会合并两个块。
答案 4 :(得分:0)
没有保证,但很多分配器都有。 如果您遇到涉及内存的性能问题,如果您直接提出该问题,您将获得更多答案。有许多很多技术可以提高C代码的内存性能;这是一个经常出现的瓶颈。