首页 > 解决方案 > 块的头部是如何在堆中格式化的?

问题描述

我知道在 32 位标头中,最高有效 29 位是数字,最低有效 3 位表示块是空闲的或已分配的。但是,我不明白为什么,例如在一个 24 位的块中,大小为 0x018,分配时 3 个最低有效位为 0x001,而标题变为 0x019。为什么标题是“0x019”?我们不应该添加这两个?

为什么标题不是“0x018001”?在此处输入图像描述

标签: memorysystemheap-memory

解决方案


从你的问题很难说你的误解在哪里。

在示例中,0x018是十进制 24 和二进制11000。这是以字节为单位的块大小。

因为malloc设计者选择分配大小为 8 字节的倍数的块,所以所有块大小将以 0 或 8(二进制 0000 或 1000)结尾。这意味着低 3 位始终为零。

与其在标头中仅为指示块是已分配还是空闲的单个位分配一个额外的字节,该设计将 0/1 存储在最低位,假设它可以被屏蔽(使用按位“和",在 C 中,&) 当需要块大小时。该位与块大小进行“或”运算以获取标题:0x18 | 1,从而产生0x19. 在二进制中,即11000 | 1 = 11001.

我不明白你为什么认为尺寸向左移动。

更一般地说,如果h是 32 位的头值,那么块大小是h & ~0x7,也可以写入h & 0xfffffff8,分配的标志是h & 1

类似地,如果您有一个块大小z和一个已分配的位a,那么标头总是由h = z | aor(如果您愿意的话)给出h = z + a,正如上面的示例值所示。


推荐阅读