将数据存储在指针的最高有效位中

我发现了一些关于标记指针的信息,其中(ab)使用类型的对齐要求将数据位存储在未使用的最低有效位中。

我想知道,你能不能对64位系统中最重要的位做同样的事情? 即使您要使用64位指针的16个最高有效位,您仍然需要超过256 TB的RAM才能重叠。

我知道理论上这是未定义的行为,但是在一些常见的操作系统(Windows / Max / Linux)中,这会如何表现?

是的,我知道这是邪恶和危险的,但这不是这个问题的意义所在。 这是一个关于将计算机程序推向极限的“假设”问题,而不是关于理智和便携式软件设计的问题。

如果你知道你确切的内存布局,你可能会这样做,但它有风险。 Windows / Mac / Linux最常见的64位系统是amd64。 在它们上面,机器只有48位虚拟地址(在可预见的将来),因此理论上你有16位可以加上较低的对齐位。

除了。 地址空间的一半是负数; 地址介于[-2 ^ 47,2 ^ 47]之间。 因此,您无法确定指针中设置的位是否实际意味着您的魔术位已设置或者您只有负位置。

除了。 今天,大多数(如果不是全部)操作系统将内核放在负地址空间中并将用户空间放在正地址空间中。 它使某些事情更容易,更快速地进行管理。 所以你可以滥用这些知识来假设玩这些比特应该是安全的。

除了。 我从来没有看到任何操作系统的保证这种情况将永远存在(并不意味着一个不存在,我只是没有看到一个)。 你可能有一天会更新你的内核,然后操作系统突然决定userland是负数,内核是正数,或者userland获得更多的地址空间。

只要你在取消引用指针之前屏蔽掉额外的位,你今天就会安全,但也许不会在明天。 当你围绕这样的假设构建你的代码时,你得到的所有痛苦都会在你未完成的行为变成你未能完成的未定义行为时得到。 把自己画成这样的角落并不好玩。