memory - 块的头部是如何在堆中格式化的?
问题描述
我知道在 32 位标头中,最高有效 29 位是数字,最低有效 3 位表示块是空闲的或已分配的。但是,我不明白为什么,例如在一个 24 位的块中,大小为 0x018,分配时 3 个最低有效位为 0x001,而标题变为 0x019。为什么标题是“0x019”?我们不应该添加这两个?
解决方案
从你的问题很难说你的误解在哪里。
在示例中,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 | a
or(如果您愿意的话)给出h = z + a
,正如上面的示例值所示。
推荐阅读
- unity3d - 如何使用具有固定肘部旋转的 2D IK 瞄准枪?
- ios - TableView 单元格重复/重复
- ajax - 角度ajax错误响应上的奇怪字符
- php - PHP 脚本到 MD5 单独散列每一行
- python - 使用间接绘图的小行星程序,glMultiDrawArraysIndirect 不渲染和绘图空白
- angular - “OperatorFunction”类型上不存在属性“订阅”
' - node.js - 通过 Crontab 自动导出 amCharts-PDF-Export?
- reactjs - 检查 If/Else 块奇怪行为中的空数组
- python-3.x - 导入子模块然后从脚本调用函数
- php - Slim (V3) 框架:为生成的链接添加前缀,但不为传入路由添加前缀