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