按位或指针地址应用的含义
Meaning of applying bitwise or with a pointer address
虽然我是 reading this code ART 实现,但我不明白调用 SET_LEAF 来按位或使用指针地址
背后的原因
#define SET_LEAF(x) ((void*)((uintptr_t)x | 1))
*ref = (art_node*)SET_LEAF(make_leaf(key, key_len, value));
我也看到了
#define IS_LEAF(x) (((uintptr_t)x & 1))
它查看最低有效位以检查它是否是叶节点。
现在整个参数只有在指针地址是偶数 (0x100504080) 时才有效。
2 | 1 // 3
3 | 1 // 3
是否保证指针地址在所有架构中始终为偶数?
编辑:
可能重复 How come local types always get an even address
上面的问题:我可以安全地假设无论我有什么样的数据,指针总是从事件编号开始吗?
这在技术上是未定义的行为,但考虑到他们使用 _mm_movemask_epi8
的事实,他们可能并不关心可移植性。在具有标准 glibc malloc 的 x86 中,返回的地址应始终与一个字对齐(64 位中为 8 个字节),这意味着它始终是偶数。
虽然我是 reading this code ART 实现,但我不明白调用 SET_LEAF 来按位或使用指针地址
背后的原因 #define SET_LEAF(x) ((void*)((uintptr_t)x | 1))
*ref = (art_node*)SET_LEAF(make_leaf(key, key_len, value));
我也看到了
#define IS_LEAF(x) (((uintptr_t)x & 1))
它查看最低有效位以检查它是否是叶节点。 现在整个参数只有在指针地址是偶数 (0x100504080) 时才有效。
2 | 1 // 3
3 | 1 // 3
是否保证指针地址在所有架构中始终为偶数?
编辑: 可能重复 How come local types always get an even address
上面的问题:我可以安全地假设无论我有什么样的数据,指针总是从事件编号开始吗?
这在技术上是未定义的行为,但考虑到他们使用 _mm_movemask_epi8
的事实,他们可能并不关心可移植性。在具有标准 glibc malloc 的 x86 中,返回的地址应始终与一个字对齐(64 位中为 8 个字节),这意味着它始终是偶数。