将数据存储在指针

时间:2015-11-27 10:48:55

标签: c++ c pointers

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

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

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

是的,我知道这是邪恶和危险的,但这不是这个问题的意思。这是"如果"关于将计算机程序推向极限的问题,而不是关于理智和便携式软件设计的问题。

1 个答案:

答案 0 :(得分:8)

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

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

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

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

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