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

Ste*_* Lu 2 c++ 64-bit bit-manipulation x86-64 virtual-address-space

我正在构建一个数据结构,每2或3位设置为64位整数.

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

出于我的表示(保证设置最高或第二高位)的目的,如果可以假设指针永远不会设置其最高的两位,即此断言成立:

void *sixty_four_bit_pointer = a_valid_address(); 
bool always_zero = 0xC000000000000000 & sixty_four_bit_pointer;
Run Code Online (Sandbox Code Playgroud)

那我就可以做到这一招!

Ray*_*hen 9

这一般不安全.这个程序可以像这样引发技巧,从而导致/LARGEADDRESSAWAREWindows中的旗帜.(阿卡"这就是我们不能拥有美好事物的原因.")

你可以做的是使用底部位而不是顶部位.由于您的结构包含指针,因此它已经是8字节对齐,这意味着底部的三位始终为0,因此您可以将这些位用作标记位.