指针的大小:相关因素

13
我在理解指针变量大小取决于哪些因素方面遇到了困难,查阅了一些参考资料,目前唯一得知的信息是指针大小依赖于处理器架构。我想了解以下细节:
  • 请详细解释架构如何影响指针的大小。
  • 通常情况下,如果指针是x位,则应该有0到2^(X)-1个地址位置。我在将地址位置数和程序可用的实际内存量联系起来时有些迷失。

在32位机器上它是4个字节,在64位机器上它是8个字节。这并不是标准保证的,有时在现实生活中也是错误的。 - ouah
2
不能保证32位CPU等于32位指针,等等。在OS/400上,一个小型的32位架构CPU使用128位指针和单个全局128位虚拟地址空间。你的假设是错误的。如果你感兴趣,可以查看这个问题获取更多信息:https://dev59.com/92DVa4cB1Zd3GeqPazLN?rq=1 - WhozCraig
许多64位机器可以运行32位和64位可执行文件。 - Jonathan Leffler
3个回答

10

指针是一个变量,它保存另一个内存位置的地址。

如果你在32位计算机上运行程序,CPU寄存器(包括所有其他寄存器)保存的内存引用将是32位长度; 这基本上就是32位的含义(寄存器是32位字长),因此指针(内存位置)通常会有32位长(4字节)

同样适用于64位计算机,因此在为64位CPU编译的C程序中,指针通常会有8字节长(64位)

编辑:
还要注意,在大多数现代架构中,您实际上并不使用代码来寻址物理内存;您运行和寻址的是所谓的虚拟内存。

基本概念是CPU / OS组合欺骗您的程序,让您拥有完整的地址空间。

同样地,地址空间(您可以在内存中寻址的空间)的长度将取决于CPU可以寻址的位置有多远,这(一般情况下)将取决于其字长。


4
指针大小取决于许多因素(硬件、操作系统、编译器等),同一平台上不同的指针类型可能具有不同的大小。例如,有些嵌入式处理器使用哈佛架构,在其中代码和数据位于单独的内存区域,并且每个区域可能具有不同的总线大小(例如,数据为8位,代码为16位)。这意味着对象指针(int *char *double *)可能宽度为8位,但函数指针(int (*)())可能宽度为16位。
另一个例子是考虑一个“字寻址”架构,其中内存的基本单位不是8位字节,而是更大的单位(宽度可以为16、18、24、32、36、64或128位,或其他值;2的幂已被证明是方便的,但不是必要的)。其中一些架构可能选择将多个char值打包到单个字中,这意味着char *需要几个额外的位来指定字内的偏移量。
在书籍C: A Reference Manual中,哈比森和斯蒂尔描述了一个具有36位字长的体系结构。字符数据以7位ASCII值存储,这意味着每个字可以容纳5个字符,其中一个比特未使用;所有其他类型都占用完整的字。

规范是否对指针的大小有任何规定? - Talespin_Kit
1
@Talespin_Kit:没有特定的大小要求。请参阅N1570,6.2.5/28。简而言之,char *void *必须具有相同的大小和表示形式,兼容类型的限定和未限定版本的指针必须具有相同的大小和表示形式,所有struct类型的指针必须具有相同的大小和表示形式(union类型也是如此)。除此之外,这取决于实现。但是没有最小大小或表示要求。 - John Bode

0
我在理解C语言指针变量大小的因素方面遇到了困难。我查阅了一些资料,目前得到的唯一信息是指针大小取决于处理器架构。在32位机器上为4字节,在64位机器上为8字节。我想知道以下细节:这并不总是正确的,无论如何,您必须理解指针的大小保存虚拟地址(在支持它的操作系统上)。因此,指针的大小取决于内存总线宽度。这就是为什么架构会影响指针大小的原因。请注意,并非所有指针的大小都相同,例如。

4
指针的大小不取决于内存总线宽度。8086和8088中的指针大小相同,但8086的内存总线宽度为16位,而8088的则为8位。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接