【发布时间】:2012-03-05 13:31:30
【问题描述】:
我最近偶然发现了一个“hacky”答案(this one),其中提到因为(我假设是 32 位)C/C++ 指针通常是 4 字节对齐的,每个指针的最后 2 位始终为零。我不明白为什么会这样。为什么不使用所有 32 位来表示一个地址?
请忽略我上面链接的实际答案的优点。我只对关于 2 个 LSB 的观察感兴趣。
【问题讨论】:
-
最近的 JVM 实际上利用了这一点(参见 CompressedOops)——因为他们知道这些位将为零,所以他们可以使用 32 位指针移位来寻址超过 2^32 字节的内存。但他们可以保证这些位始终为零,在大多数情况下,这可能比您节省的内存更麻烦。
-
您确实使用所有 32 位来表示地址。但由于地址始终是 4 的倍数,因此地址的最后两位始终为零。与十进制相同。如果您的数字始终是 10 的倍数,则最后两位数将始终为零。
-
为什么地址总是4的倍数?实现 4 字节对齐只需要 2 的倍数。那么,为什么不使用所有 32 个可用位来存储指针地址呢?
标签: c++ pointers memory-alignment