【问题标题】:size of a C pointer depends on?C指针的大小取决于?
【发布时间】:2012-06-17 20:30:42
【问题描述】:

C 指针的大小取决于什么?是数据总线的宽度,地址总线的宽度,还是CPU的字长?

我相信它应该取决于地址总线的宽度,因为指针必须寻址那么多位置。我说的对吗?

(我正在寻找依赖的原因,如果有的话)

【问题讨论】:

  • 只要它遵守所有规则,它可能取决于它相当合法地指向的类型。
  • 地址总线和数据总线与native word size和native address size或多或少无关; 8085 在 8 位(字符可寻址)数据总线上有 16+ 位寻址(+分段)。最初的 386es 有 16 位宽的数据总线。 32 位奔腾具有 36 位外部地址总线。

标签: c computer-science


【解决方案1】:

所有指针在内存中占用相同数量的空间,而指针在内存中的大小取决于编译代码的 CPU 架构。

【讨论】:

  • 整洁!所以我可以为 16 位 编译我的代码并让它为 64 位平台转 64 位?
  • @K-ballo:我更新了我的答案以澄清您的讽刺评论不是真的:P
  • 谢谢,但实际上大小并不取决于代码将在哪里运行,而是取决于用于构建它的编译器(主要是目标平台)。此外,指向不同对象类型的指针在单个平台内可以具有不同的大小。
  • 其实我的想法和你说的一样,只是我在措辞上遇到了困难。
  • @K-ballo 引用 C 的对象是什么意思?你能举一个指针大小不同的例子吗
【解决方案2】:

指针的大小取决于您的编译器实现。在实践中,它几乎总是您所构建架构的原生字长。

值得注意的是,C 语言标准允许指向不同类型的指针可能具有不同的大小,以便更好地支持具有不同大小的程序和数据内存等的哈佛架构。

【讨论】:

  • "几乎" 是关键,因为int最快的整数,而不是最宽的
  • 谁说int 必须是最快的?有很多 8 位架构,编译器默认使用 16 位 int
  • 我的意思是那些相同的 8 位架构是一些例外 - 它们的本机操作仅适用于 8 位值,但它们可以寻址 16 位价值(或更多)的内存,因此它们的指针相应地更大。
【解决方案3】:

一种循环定义,但它取决于实现用来识别对象所在位置的地址空间的大小。这又可能取决于硬件、操作系统或 C 实现者的突发奇想。

因此,如果实现希望有 65535 个潜在位置来存储 char,那么它将使用(至少)16 位指针来存储 char*。对于 40 亿左右(或者可能是一半,某些实现不使用或不能使用指针的最高位),32 位。远远超过你的内存,64 位。

在实践中,该决定通常受实现期望程序在其上运行的操作系统的限制。如果操作系统的内存分配函数返回一个 64 位地址,那么使用较小的指针大小实现是相当不方便的,尽管在特定情况下可能会有一些技巧。

如果实现要在没有操作系统的情况下运行,那么它将使用适合其运行的硬件的内存映射大小的大小。如果它与操作系统一起运行,那么操作系统可能而不是必然使用适合硬件的大小。我说不一定,因为现代 64 位操作系统有支持 32 位进程的习惯,因此为该 32 位环境编译并在 64 位机器上运行的程序将使用 32 位指针。适合硬件的指针大小可能与同一硬件上的字大小相同,也可能不同——通常是这样。

最后,由于某些类型大于 1 字节,原则上可以通过将较小的指针用于较大的类型来获得一些好处,并且标准允许这样做。想象一台具有 8 位字节、16 位整数和 128k 可寻址内存的机器,int 对象在其上具有 2 字节对齐。那么char* 至少需要 17 位(占用 3 个字节的存储空间),而原则上 int* 只需 16 位(2 个字节的存储空间),因为任何 int 的地址始终为 0,因此不需要严格存储。如果实现可以安排始终正确使用地址,则允许使用sizeof(int*) < sizeof(char*)。实际上,几乎没有人这样做过。

【讨论】:

    【解决方案4】:

    这取决于所讨论的 CPU 架构。您可以使用intptr_t(仅限C99)编写考虑到这一点的可移植代码。

    【讨论】:

    • 因此指针大小对数据/地址总线宽度或字大小没有可靠的依赖性。这只是一个架构决策?
    • @LunarMushrooms - 编译器设计决策,是的。
    【解决方案5】:

    指针的大小取决于程序编译的 CPU 架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 2021-07-23
      相关资源
      最近更新 更多