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

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

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

是的,我知道这是邪恶和危险的,但这不是这个问题的内容。这是一个关于将计算机程序推向极限的“假设”问题,而不是关于健全和可移植的软件设计的问题。

最佳答案

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

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

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

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

只要在取消引用指针之前屏蔽掉多余的位,今天就安全了,但明天可能就不行了。当你围绕这样的假设构建你的代码时,当你逃脱的未定义行为变成你无法逃脱的未定义行为时,你应该承受所有的痛苦。把自己画成这样的角落并不好玩。

关于c++ - 将数据存储在指针的最高有效位中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33955713/

10-11 18:49