首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dlmalloc是如何合并块的?

dlmalloc是如何合并块的?
EN

Stack Overflow用户
提问于 2017-05-27 07:00:28
回答 1查看 417关注 0票数 7

下面是dlmalloc算法的详细描述:http://g.oswego.edu/dl/html/malloc.html

dlmalloc块由一些元数据组成,其中包含关于块中空间大小的信息。两个连续的自由块看起来就像

代码语言:javascript
复制
[metadata | X bytes free space | metadata ][metadata | X bytes free space | metadata]
                Block A                                     Block B

在这种情况下,我们希望将块B合并成块A。现在,,有多少字节的空闲空间应该阻塞A报表?

我认为应该是2X + 2 size(metadata) bytes,因为现在合并的块如下所示:

代码语言:javascript
复制
[metadata | X bytes free space   metadata  metadata   X bytes free space  | metadata]

但我想知道这是否正确,因为我有一本教科书,其中说元数据将报告2X bytes,而不包括我们能够编写元数据所获得的额外空间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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行处理这个差异。

也许这里更重要的教训是--当你想学到任何东西的时候--你不应该错过一个机会,直接去第一手资料来源,自己想办法解决问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44213973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档