【问题标题】:c++ pointer on 64 bit machine64位机器上的c ++指针
【发布时间】:2011-08-25 12:55:54
【问题描述】:

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

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

output: 0x7fff44a09a7c

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

谢谢。

【问题讨论】:

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

标签: c++ pointers


【解决方案1】:

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

当您想知道为什么在用户空间中通常不会看到超过 48 位的值时,这是因为当前的 AMD64 架构刚刚定义为具有 48 位的虚拟地址空间(如 Linux 上的 cat /proc/cpuinfo 所示)

【讨论】:

  • 这篇 Wikipedia(是的,我知道)文章说架构定义最多允许 64 位,但当前的实现只使用 48 位。是不是错了? en.wikipedia.org/wiki/Amd64#Architectural_features
  • @AndrzejJ 嗯,它是一个“64 位”架构,名义上的指针是 64 位的。只是目前 256TB 的虚拟地址空间绰绰有余,如果您可以假设每个指针的高 16 位为零,您可以节省电线(从而节省电力)。
【解决方案2】:

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

编辑:再想一想,我认为没有一种很好的方法可以更改默认operator&lt;&lt; 的指针格式。如果您使用std::hex 操纵器流出,则可以更改填充和宽度属性。

【讨论】:

  • 那么如果某个对象的地址是0x400c10,那就意味着省略了5个字节的前导零,对吧?
  • @user508305 可能,但请注意,所有指针的大小不一定与平台寻址能力相同。
  • 在什么情况下它们的尺寸不同?你能多谈谈这个吗,或者给我一些关键词,这样我就可以谷歌了。
  • 考虑一个指向成员函数的指针。这些通常存储为多个机器字,以便它们可以处理虚拟功能。
【解决方案3】:

为了好玩,您可以使用 C 输出,看看它是否更像您所追求的:

printf("0x%p");

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 2015-04-02
    • 2016-08-01
    • 2011-01-31
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多