64位机器上的C++指针

问题描述:

我在64位linux下使用C++,编译器(g ++)也是64位。当我打印一些变量的地址,例如一个整数时,它应该打印一个64位整数,但实际上它会打印一个48位整数。64位机器上的C++指针

int i; 
cout << &i << endl; 

output: 0x7fff44a09a7c 

我想知道另外两个字节在哪里。期待你的帮助。

谢谢。

+0

多少位没有'数1'有哪些?你会抱怨'uint32_t x = 1;'没有足够的位?你应该检查'sizeof(* int)'而不是打印东西。 –

在大多数C++实现中打印地址会抑制前导零以提高可读性。像0x00000000000013fd这样的东西并没有真正增加价值。

当你想知道为什么在用户空间中通常看不到超过48位的值时,这是因为当前的AMD64体系结构被定义为具有48位的虚拟地址空间(如在Linux上可以看到cat /proc/cpuinfo

+0

这个维基百科(是的,我知道)文章说架构定义允许多达64位,但目前的实现只使用48.它是错误的吗? http://en.wikipedia.org/wiki/Amd64#Architectural_features – AndrzejJ

+0

@AndrzejJ这是一个“64位”架构,名义上指针是64位。只是当前256TB的虚拟地址空间已经绰绰有余,并且如果您可以假设每个指针的高16位都为零,则可以节省电线(并因此节省电源)。 – Voo

他们在那里 - 他们没有去过任何地方 - 这只是流中的格式。它跳过前导零(检查流的填充和宽度属性)。

编辑:关于第二个想法,我不认为有一个很好的方式来更改指针默认operator<<的格式。如果使用std::hex操纵器进行流式处理,则可以更改填充和宽度属性。

+0

所以如果某个对象的地址是0x400c10,那就意味着5个字节的前导零被省略了,对吧? – cheng

+1

@ user508305它可能,但请注意,所有指针不一定与平台寻址功能的大小相同。 –

+0

在什么情况下他们有不同的大小?你能谈谈更多关于这个,或者只是给我一些关键词,以便我可以谷歌它。 – cheng

为了好玩,你可以使用C的输出,看看它更像是你后:

printf("0x%p");