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

问题描述

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