sizeof(long) 返回 8 个字节,但 &along(long 的地址)是 12 个十六进制数字(48 位)或 6 个字节。在使用 clang 编译的 OS X 64 位上。这里有差异还是这是一个真正的 64 位地址空间?
4 回答
我认为您将两个不同的概念混为一谈。sizeof 告诉您 long 有多长,而不是现在 long 一个地址。long 占用 6 个字节的内存,但指向它的指针(显然)只占用 6 个字节(或更可能占用 8 个字节,但由于内存的布局方式,前两个全为零)
让我扩展一些关于地址空间的解释。虽然指针在 64 位处理器中是 8 字节长,但地址空间很少需要那么多。这允许处理 2^64 个字节,远远超过我们的需要。因此,为简单起见,许多处理器和编译器只使用其中的 48 个位。有关一些有用的图表,请参阅此 wikipedia 链接:
http://en.wikipedia.org/wiki/X86-64#Canonical_form_addresses
一个地址我们一个内存位置。在 32 位系统上,它将为 32 位长,在 64 位系统上为 64 位,依此类推。
of 变量是它占用了sizeof
多少内存。它们是完全不相关的数字。
sizeof(long) 返回 8 个字节,但 &along(long 的地址)是 12 个十六进制数字(48 位)或 6 个字节。
是的,因为当您打印数字时,不会打印前导 0。例如:
int x = 0x0000000F;
printf( "%X", x );
// prints "F"
实际上,现代系统使用 64 位作为地址,但并非所有这些都被系统使用,因为 2 到 64 是在不久的将来没有人会使用的内存量。在 linux 下你可以通过做cat /proc/cpuinfo
. 在我的机器上,我有例如
地址大小:36位物理,48位虚拟
所以这将允许 64 GiB 的物理内存和 256 TiB 的虚拟内存。对于这台机器将遇到的情况,这在很大程度上已经足够了。
我不确定这是否是您看到此问题的确切原因,但当前的 64 位处理器通常实际上没有 64 位地址空间。所涉及的额外硬件将是一种浪费,因为 48 位地址空间超出了我一生中预期的需要。可能是您看到的是地址的截断版本(即,地址前面没有用零填充)。