与sizeof和addressof明显不符

时间:2011-10-30 03:04:29

标签: c sizeof address-operator

sizeof(long)返回8个字节,但& along(long的地址)是12个十六进制数字(48位)或6个字节。在使用clang编译的OS X 64位上。这里有差异还是真正的64位地址空间?

4 个答案:

答案 0 :(得分:1)

我认为你把两个不同的概念混为一谈。 Sizeof告诉你多长时间,而不是现在长的地址。一个long占用六个字节的内存,但指向它的指针(显然)只需要6个(或者更可能需要8个,但前两个因为内存的布局而全为零)

让我扩展一些关于地址空间的解释。虽然64位处理器中的指针长度为8个字节,但地址空间很少需要这么多。这允许处理2 ^ 64个字节,远远超出我们的需要。因此,为简单起见,许多处理器和编译器仅使用其中的48位。请参阅此维基百科链接以获取一些有用的图表:

http://en.wikipedia.org/wiki/X86-64#Canonical_form_addresses

答案 1 :(得分:1)

地址我们一个内存位置。在32位系统上,它将是32位长,在64位系统上是64位,依此类推。

变量的sizeof是它占用的内存量。它们完全不相关。

  

sizeof(long)返回8个字节,但& along(long的地址)是12个十六进制数字(48位)或6个字节。

是的,因为当您打印数字时,不会打印前导0。例如:

int x = 0x0000000F;
printf( "%X", x );
// prints "F"

答案 2 :(得分:1)

实际上,现代系统使用64位地址,但并非所有这些都被系统使用,因为2到64是没有人将在不久的将来使用的内存量。在linux下,您可以通过cat /proc/cpuinfo找出您的机器实际使用的内容。在我的机器上我有例如

  

地址大小:36位物理,48位虚拟

所以这将允许64 GiB的物理内存和256 TiB的虚拟内存。这足以满足这台机器所遇到的需求。

答案 3 :(得分:0)

我不确定这是否是你看到这个的确切原因,但目前的64位处理器通常实际上没有64位地址空间。所涉及的额外硬件将是一种浪费,因为48位的地址空间超出了我的预期。可能是你看到地址的截断版本(即地址没有用零填充前缀)。