按位或指针地址应用的含义

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 个字节),这意味着它始终是偶数。