【问题标题】:Do I have the guarantee that all pointers have the same size in bytes? [duplicate]我是否保证所有指针的字节大小都相同? [复制]
【发布时间】:2013-05-10 12:11:13
【问题描述】:

在 C 和 C++ 中,我是否保证所有指针都具有相同的字节大小,或者换句话说:

sizeof(void*) = sizeof(char*) = sizeof(int*) = ...

或者有一些不正确的系统?

【问题讨论】:

  • 我会让其他人回答您给出的示例,但在 C++ 中肯定会有所不同的是class Foo; sizeof(void (Foo::*)())
  • @DarkFalcon 为什么会有所不同?
  • @leemes:因为它不是内存地址。 “最重要的是,与全局函数指针不同,成员函数指针在大多数实现中不仅仅是函数第一条指令的地址”yosefk.com/c++fqa/function.html
  • 您需要担心的不仅仅是它们的尺寸。您还需要担心对齐要求(可能还有位表示)。
  • 他们在同一个系统上做。对于给定的系统,所有指针都是(在 C 中,idk 关于 C++ 和类指针)。这是因为指针指向内存中的地址。在 32 位系统(4 个字节)中,寻址所有内存区域需要 4 个字节。因此,指向值的指针将是 4 个字节(因为我们只需要 4 个字节即可到达任何地址)。在 64 上,它通常是 8 字节指针(因为我们需要两倍的位来寻址所有内存!)。虽然有些系统可能会有所不同,但这是典型的实现方式。

标签: c++ c pointers architecture sizeof


【解决方案1】:

没有。标准中没有保证。

有一些例外是某些系统。尽管它在许多典型系统中是固定的,并且取决于该系统的体系结构。例如,在 32 位系统中,指针是 4 个字节。

顺便说一句,uintptr_t 可以保存指针(也许我们可以假设它具有当前系统中指针的最大大小):

uintptr_t无符号整数类型,能够持有指针

【讨论】:

  • 我知道 32 位和 64 位系统的指针大小通常不同。但我的问题不是这样。我的问题是:在给定的架构上,我是否可以保证指向不同类型的指针具有相同的大小。
  • “否”,即使在一台给定的机器上也无法保证。
  • 不保证没有指针的大小大于uintptr_t。该标准保证任何指针都可以转换为uintptr_t 并返回。但是,为方便起见,指针可以具有某种扩展形式(例如,段和偏移量),将其转换为 uintptr_t 可以将其压缩为规范表示。
  • @EricPostpischil:非常精确 :-) 我认为作为程序员,更容易假设它是最大值。我更新了我的答案,使其不太确定。
  • @Vincent: 6.2.5/28, "指向void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。48) 同样,指向合格或不合格版本的指针兼容类型的指针应该有相同的表示和对齐要求。所有指向结构类型的指针应该有相同的表示和对齐要求。所有指向联合类型的指针应该有相同的表示和对齐要求。指向其他类型的指针不必具有相同的表示或对齐要求。”
猜你喜欢
  • 2012-09-27
  • 2021-06-04
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2014-03-18
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多