C 按位或与指针地址一起应用的含义

C 按位或与指针地址一起应用的含义,c,pointers,bitwise-operators,C,Pointers,Bitwise Operators,虽然我是一个艺术实现的人,但我不理解调用SET_LEAF来按位或使用指针地址的原因 #定义集合_叶(x)((void*)((uintpttr_t)x|1)) *ref=(艺术节点*)设置叶子(制作叶子(键,键,值)); 我也看到 #define IS_LEAF(x) (((uintptr_t)x & 1)) 它会查看最低有效位以检查它是否是叶节点。 现在,只有当指针地址是偶数(0x100504080)时,整个参数才起作用 是否保证指针地址在整个体系结构中始终为偶数 编辑: 可能重复

虽然我是一个艺术实现的人,但我不理解调用SET_LEAF来按位或使用指针地址的原因

#定义集合_叶(x)((void*)((uintpttr_t)x|1))
*ref=(艺术节点*)设置叶子(制作叶子(键,键,值));
我也看到

#define IS_LEAF(x) (((uintptr_t)x & 1))
它会查看最低有效位以检查它是否是叶节点。 现在,只有当指针地址是偶数(0x100504080)时,整个参数才起作用

是否保证指针地址在整个体系结构中始终为偶数

编辑: 可能重复


最上面的问题:我能安全地假设指针总是从事件号开始,不管我有什么类型的数据吗?

这在技术上是未定义的行为,但考虑到他们使用
\u mm\u movemask\u epi8
,他们可能不关心可移植性。在使用标准glibc-malloc的x86中,返回的地址应该始终与一个字(64位中的8字节)对齐,这意味着它始终是偶数。

我编辑了这个问题以减少混淆。首先调用SET|LEAF,它执行x | 1,然后调用is|LEAF检查x&1==1。只有当指针地址是偶数时,这才有效。我的问题是它有保证吗@马可博内利这看起来像是我未定义的行为。。。我不确定,但他们将地址转发一个字节的部分在meThis library看来是可疑的,看起来它也不是完全可移植的。在所有体系结构中,它支持一些非x86的代码(非SSE2代码路径非常糟糕)。当然,这仍然是一个有效的问题,但我注意到这一点是为了让您知道应该期望什么:速度高于可移植性。代码通过使用指针值的l.s.b.来存储标志,从而避免分配一些大部分浪费的空间。这些指针最终来自对
calloc()
的调用,因此代码假设这些指针在转换为整数时也会被调用。(旁注:Linux内核在红黑树的实现中使用了类似的技巧。)
\u mm\u movemask\u ep18
调用在预处理器条件代码中。还有非x86代码。代码确实假设
malloc
(或
calloc
)将返回偶数地址。
2 | 1 // 3
3 | 1 // 3