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