【问题标题】:Storing data in the most significant bits of a pointer将数据存储在指针的最高有效位中
【发布时间】:2015-11-27 10:48:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果系统将完整地址空间用于虚拟地址,则无法执行此操作。你不应该在任何系统上这样做,因为这是一件非常愚蠢和危险的事情,为了获得一些额外的比特。尤其是在 64 位系统上:您认为在 64 位系统上需要一些额外的位以及一些 16GB+ 可用 RAM 的原因是什么?
  • @Lundin:嗯,我可以在嵌入式系统上看到一些用法。但我同意在使用这种“黑客”之前应该三思而后行。如果,永远不要用于通用指针或成熟的操作系统应用程序代码。
  • 和类似的问题一样,如果你需要问这个问题,那么你绝对不应该考虑做这样的事情。
  • 这让我想起了过去的 Macintosh 时代,他们使用 8 MSB 的指针来存储东西。使用 68000 处理器没问题,因为地址总线只有 24 位宽。然而,这是一个愚蠢的想法,因为这个技巧在后来拥有更多 RAM 的处理器上不再适用。
  • @Art 您的代码忽略您的位字段没有正确重叠您的指针值并可能干扰实际地址的可能性,因此您的代码受 3.4 .3 未定义行为可能的未定义行为范围从完全忽略情况导致不可预测的结果......因此,UB。期间。

标签: c++ c pointers


【解决方案1】:

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

除了。一半的地址空间是负数;地址在 [-2^47,2^47) 之间。所以你不能确定指针中设置的位是否真的意味着你的魔法位被设置了或者你只是有一个负地址。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-07
    • 2011-09-13
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多