是否可以安全地假设64位指针中的16个高位(2个对我来说足够了)是未设置的

Is it possible to safely assume that the 16 high bits (2 are sufficient for me) in a 64-bit pointer are unset?

本文关键字:对我来说 2个 设置 16个 安全 假设 64位 是否 指针 高位      更新时间:2023-10-16

我正在构建一个数据结构,它将每2或3位的一个集位设置为64位整数。

如果我也可以在这个结构中存储指针(当它们是树中的终端节点时,但这并不相关),这对我来说会很方便。

为了我的表示(它保证设置最高或第二高的位)的目的,如果可以假设指针从未设置其最高的两位,即这个断言成立:

void *sixty_four_bit_pointer = a_valid_address(); 
bool always_zero = 0xC000000000000000 & sixty_four_bit_pointer;

那我就可以耍这个把戏了!

这通常是不安全的。正是这样的程序导致了Windows中的/LARGEADDRESSAWARE标志。(阿卡"这就是为什么我们不能拥有美好的东西。")

你能做的就是使用最底层的比特而不是最顶层的比特。由于您的结构包含一个指针,它已经是8字节对齐的,这意味着底部的三个位总是0,所以您可以将这些位用作标记位。