13

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

  • 请详细解释架构如何影响指针大小。
  • 一般来说,如果指针是x bits那么地址位置的数量应该在那里。我在将地址位置的数量和程序可用 的实际内存量0 to 2^(X)-1联系起来时丢失了轨道。
4

3 回答 3

10

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

现在,如果您在 32 位架构上运行,则保存内存引用的 CPU 寄存器(很可能也是所有其他寄存器)将是 32 位长度;这基本上就是 32 位的含义(寄存器是 32 位字长),因此指针(这是一个内存位置)通常是 32 位长(4 字节)

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

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

基本概念是 CPU/OS 组合使您的程序误以为您拥有完整的地址空间。

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

于 2012-10-28T14:36:15.793 回答
4

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

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

C: A Reference Manual一书中,Harbison & Steele 用 36 位字描述了一种架构。字符数据存储为 7 位 ASCII 值,这意味着每个字可以包含 5 个字符,其中一位未使用;所有其他类型都占满了单词。

于 2012-10-28T20:10:57.853 回答
0

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

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

于 2012-10-28T14:42:06.943 回答