如何在堆中格式化块的标头?

时间:2018-06-06 01:36:48

标签: memory heap system

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

为什么标题不是“0x018001”而是“enter image description here

1 个答案:

答案 0 :(得分:1)

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

在示例中,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,分配的标志为{{1 }}

同样,如果您有一个块大小h & 1和一个分配的位z,那么标题始终由a提供,或者,如果您更愿意,h = z | a ,就像上面显示的示例值一样。