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

Ric*_*ter 3 c c++ pointers

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

我想知道,你不能对64位系统中最重要的位做同样的事情吗?即使你要使用64位指针的16个最高位,你仍然需要超过256太字节的RAM来重叠它们.

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

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

Art*_*Art 8

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

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

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

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

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