2016-03-08 37 views

回答

1

分配以字节为单位。也就是说,您传递给malloc的整数是您要分配的字节数。所以memcheck只需要每个字节一位来跟踪是否分配了内存地址。

但是初始化可以在单个位上工作,而不是在整个字节上。如果字节X的所有位都未初始化,然后执行X = X | (1 << 3),则现在只初始化X的一位。因此memcheck会跟踪每个单独的位是否已经初始化。由于在一个字节中有8位(在memcheck支持的所有CPU上),这意味着memcheck需要每个字节另外8位来跟踪哪些位已经初始化。

2

好像就是这里解释:

这是最简单的思考MEMCHECK实现合成CPU它等同于一个真正的CPU,除了一个重要的细节。真实CPU处理,存储和处理的数据的每一位(字面上)都在合成CPU中具有关联的“有效值”位,该位表示伴随位是否具有合法值。在接下来的讨论中,该位被称为V(有效值)位。

因此,Valgrind测试环境中的每一位都有一个相应的有效无效位来跟踪其有效性。这对比特字段尤其重要,在比特字段中,单个比特可以表示类似布尔值的内容,仅由一个比特表示。

在这个级别上,Valgrind正在进行内存分辨率的绝对精度到二进制级别,看起来,为了提供一个可以观察和执行分析的良好数据景观。