【发布时间】: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。期间。