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

C++ 是否可以安全地假设64位指针中的16高位(2对我来说足够)未设置?,c++,64-bit,bit-manipulation,x86-64,virtual-address-space,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

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

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

为了表示的目的(保证设置最高或第二高位),如果可以假设指针从未设置过其最高两位,即此断言保持:

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

那我就可以玩这个把戏了

这通常是不安全的。正是程序采用了这样的技巧,才导致了Windows中的
/largeaddressware
标志。(又名“这就是我们不能拥有美好事物的原因。”)


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

Nope,我见过Linux使用的随机起始偏移量使用了整个64位。好吧,我想我必须在我的结构中添加另一个字段。我在某个地方读到,一些处理器有明确的陷阱,以防止将高位用于其他目的。很常见的假设是指针(至少指向需要对齐的对象)清除其低位2或3位。这种攻击至少可以追溯到早期的Lisp实现,例如,实际上。。。我从没想过指针的另一端!这可能会奏效。
char*
可能不对齐吗?指针的类型必须是8字节对齐的类型,这样我才能确保它有三个未设置的低位。i、 你假设我的指针是指向那个结构的指针。对比如,我不能假设一个
char*
有低位未设置,但我可以假设一个
uint64\u t*
有低位未设置。不清楚指针指向什么。我认为它是指向您的结构的指针(该结构又包含更多指向其他节点的指针)。如果它只是一个
char*
,那么您需要自己实施外部对齐。(即,确保
char*
指针是8字节对齐的。)