指针大小:依赖因素

我发现很难理解C中指针变量大小所依赖的因素。 我检查了一些参考文献,我到目前为止获得的唯一信息是pointer大小取决于处理器架构 。我想知道以下细节

  • 请详细说明架构如何影响指针大小。
  • 通常,如果指针是x bits则应该存在0 to 2^(X)-1个地址位置。在关联地址位置数量和程序可用的实际存储量时,我正在丢失轨道。

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

现在,如果您运行的是32位架构,那么保存内存引用的CPU寄存器(很可能也是所有其他寄存器)的长度为32位; 这基本上是32位的意思(寄存器是32位字长)因此指针(它是一个存储单元) 通常是32位长(4字节)

这同样适用于64位CPU,因此为64位CPU编译的C程序中的指针通常具有8个字节长度(64位)

编辑:
还请注意,在大多数现代架构中,您并没有真正使用代码处理物理内存; 你运行并解决所谓的虚拟内存。

基本概念是CPU / OS组合使您的程序无法为您提供完整的地址空间。

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

指针大小取决于很多因素(硬件,操作系统,编译器等),并非同一平台上的所有指针类型都可能具有相同的大小。 例如,存在使用哈佛架构的嵌入式处理器,其中代码和数据在单独的存储器区域中,并且每个可具有不同的总线大小(例如,8位用于数据,16位用于代码)。 这意味着对象指针( int *char *double * )可以是8位宽,但函数指针( int (*)() )可以是16位宽。

再举一个例子,考虑一个字寻址架构,其中存储器的基本单元不是8位字节,而是更大的单元(宽度可以是16,18,24,32,36,64或128位) ,或其他一些价值; 2的权力已被certificate是方便的,但不是必要的)。 其中一些体系结构可能会选择将多个char值打包到一个单词中,这意味着char *需要一些额外的位来指定单词的偏移量。

C:A参考手册中 ,Harbison&Steele描述了一个具有36位字的架构。 字符数据存储为7位ASCII值,这意味着每个字可以容纳5个字符,其中一位未使用; 所有其他类型都采用了完整的单词。

我发现很难理解C中指针变量大小所依赖的因素。 我检查了几个引用,我到目前为止唯一的信息是指针大小取决于处理器架构。 它在32位机器上是4个字节,在64位机器上是8个字节。 我想知道以下细节

这不一定是这种情况,无论如何你必须理解指针的大小保存虚拟地址的地址(在支持它的操作系统上)。 因此指针的大小取决于内存总线宽度。 这就是架构影响指针大小的原因。 请注意,它并非始终如此:例如,所有指针的大小可能不同。