下面是dlmalloc算法的详细说明:http://g.oswego.edu/dl/html/malloc.html
dlmalloc block 由一些元数据预订,其中包括有关 block 中空间量的信息。两个连续的空闲 block 可能看起来像
[metadata | X bytes free space | metadata ][metadata | X bytes free space | metadata]
Block A Block B
在这种情况下,我们希望将 block B 合并到 block A。现在 多少字节的空闲空间应该阻塞一个报告?
我觉得应该是
2X + 2 size(metadata) bytes
,因为现在合并的 block 看起来像:[metadata | X bytes free space metadata metadata X bytes free space | metadata]
但我想知道这是否正确,因为我有一本教科书说元数据将报告
2X bytes
不包括我们从能够覆盖元数据中获得的额外空间。
最佳答案
您可以通过 looking at the source 自己查看答案.以 line 1876 开头验证您的图表。元数据只有两个 size_t
无符号整数,通过别名 struct malloc_chunk
(line 1847 访问)。字段 prev_size
是前一个 block 的大小,size
是这个的大小。两者都包括 struct malloc_chunk
的大小本身。在几乎所有机器上这将是 8 或 16 字节,具体取决于代码是针对 32 位还是 64 位寻址编译的。
“正常情况”合并代码从 line 3766 开始.可以看到size
它用于跟踪合并的变量是 block 大小。
所以 - 是的 - 在标记为 /* consolidate backward */
的代码块中和 /* consolidate forward */
,当他添加前面和后面的 block 的大小时,他隐含地添加了 struct malloc_chunk
的大小正如你所怀疑的那样。
这表明你的解释是正确的。我的期望是教科书作者只是对 block 大小(包括元数据)和分配给用户的内存块大小之间的差异感到草率。顺便说一句,malloc
在 line 3397 处理这种差异.
也许这里更大的教训是——当你试图学习任何东西时——你永远不应该错过直接去第一手资料并为自己找出东西的机会。
关于unix - dlmalloc 如何合并 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44213973/