与sizeof和addressof明显不符

问题描述 投票:1回答:4

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

c sizeof address-operator
4个回答
1
投票

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

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

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


1
投票

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

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

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


1
投票

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

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

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

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

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.