访问http://valgrind.org/docs/manual/mc-manual.html#mc-manual.machine为什么valgrind的“有效值”需要8位?
valgrind使用V位来验证数据的有效性。在我看来,只有1位可以验证有效性,但为什么valgrind需要8位?
访问http://valgrind.org/docs/manual/mc-manual.html#mc-manual.machine为什么valgrind的“有效值”需要8位?
valgrind使用V位来验证数据的有效性。在我看来,只有1位可以验证有效性,但为什么valgrind需要8位?
分配以字节为单位。也就是说,您传递给malloc
的整数是您要分配的字节数。所以memcheck只需要每个字节一位来跟踪是否分配了内存地址。
但是初始化可以在单个位上工作,而不是在整个字节上。如果字节X的所有位都未初始化,然后执行X = X | (1 << 3)
,则现在只初始化X的一位。因此memcheck会跟踪每个单独的位是否已经初始化。由于在一个字节中有8位(在memcheck支持的所有CPU上),这意味着memcheck需要每个字节另外8位来跟踪哪些位已经初始化。
好像就是这里解释:
这是最简单的思考MEMCHECK实现合成CPU它等同于一个真正的CPU,除了一个重要的细节。真实CPU处理,存储和处理的数据的每一位(字面上)都在合成CPU中具有关联的“有效值”位,该位表示伴随位是否具有合法值。在接下来的讨论中,该位被称为V(有效值)位。
因此,Valgrind测试环境中的每一位都有一个相应的有效无效位来跟踪其有效性。这对比特字段尤其重要,在比特字段中,单个比特可以表示类似布尔值的内容,仅由一个比特表示。
在这个级别上,Valgrind正在进行内存分辨率的绝对精度到二进制级别,看起来,为了提供一个可以观察和执行分析的良好数据景观。
我会假设这是因为它可以检查位域的有效性。如果将位域设置为全1,则可能与位域位于同一字或字节中的其他位可能保持无效。 –