为什么指针的大小在C ++中是4bytes

时间:2010-03-11 21:20:37

标签: c++

在32位机器上,为什么指针的大小是32位?为什么不是16位或64位?什么是缺点和优点?

8 个答案:

答案 0 :(得分:20)

因为它模仿汇编程序中实际“指针”的大小。在具有64位地址总线的机器上,它将是64位。在旧版6502中,它是一台8位机器,但它有16位地址总线,因此可以处理64K内存。在大多数32位机器上,32位足以处理所有内存,因此这就是C ++中指针大小的含义。我知道早期的一些M68000系列芯片只有一个24位的存储器地址空间,但它是从32位寄存器中寻址的,所以即使指针也是32位。

在80286的旧时代,情况更糟 - 有一个16位地址寄存器和一个16位段寄存器。某些C ++编译器没有向您隐藏,并且根据您是否要更改段寄存器,使您将指针声明为nearfar。幸运的是,我已经回收了大部分脑细胞,所以我忘了如果near指针是16位 - 但在机器级别,它们就是。

答案 1 :(得分:7)

C ++中指针的大小为 实现定义 。 C ++可以运行在从烤面包机芯片到大型主机的任何东西上。不同的体系结构需要不同大小的数据类型。

如果在您的实现上指针是32位,那么这很可能是一个可以处理2 ^ 32字节的架构。 (请注意,即使 bytes 的大小也可能因实现而异。)64位体系结构通常可以处理2 ^ 64字节,因此这些体系结构上的实现可能会有64位的指针大小。

答案 2 :(得分:5)

16位显然是不够的 - 那么你只能解决64K。

为什么不在32位系统上模拟64位 - 我猜是因为指针算法的性能会降低。

答案 3 :(得分:2)

正如许多其他答案中所提到的,指针的大小不必是32位 - 实现将指针的大小设置为平台的体系结构所指示的任何大小。在具有64位寻址的系统上,指针的大小通常为64位。

但是,您还应该注意,即使在单个实现上,不同类型的指针也可能具有不同的大小。特别是,指向成员的类型(我将授予的是奇数球指针)可能具有与指向对象的普通指针不同的大小。

关于普通旧函数的指针也是如此 - 它们的大小可能与指向对象的指针不同(这适用于C和C ++)。但是在现代桌面系统上,您通常会发现指向函数的指针与指向对象的指针大小相同。

以下是指向成员函数指针的简短示例:

#include <stdio.h>

class A {};

class B {};

class VirtD: public virtual A, public virtual B {

public:

   virtual int Dfunc() { return 5; };

};

typedef int (VirtD::* Derived_mfp)();

int main()

{

   VirtD virtd;

   Derived_mfp mfp = &VirtD::Dfunc;

   printf( "sizeof( mfp) == %u\n", (unsigned int) sizeof( mfp));

}

在MSVC上显示:sizeof(mfp)== 12。

答案 4 :(得分:0)

指针的大小与架构(32位,64位)几乎没有关系。 32位通常是指寄存器大小为32位的事实。因此,使用一个寄存器可以解决的最大可能地址数为2^32。因此,它归结为使用寄存器寻址存储器插槽的效率。

答案 5 :(得分:0)

使用32位指针,您可以指向比16位指针更宽的内存范围。当32位指针被标准化时,64位CPU不是很受欢迎(甚至不存在?)。因此,指针将无法适应CPU寄存器,这是速度的一个非常重要的因素。

答案 6 :(得分:0)

回答你的问题:C ++本身对指针大小的描述很少,当然也不是说它必须是32位或任何东西。指针的大小应该是机器架构的自然尺寸。

答案 7 :(得分:0)

为什么不是16位?因为,假设一个扁平的32位地址空间,你不能寻址每个字节。远非如此:您只能使用16位指针寻址2个 16 唯一位置。即使你的指针只指向dwords而不是字节,这仍然留下1073676288 dwords无法寻址。

假设32位地址空间扁平,您可以使用32位指针对每个字节进行寻址。此时,64位指针只是浪费空间,除非您想要向每个指针添加其他信息。例如,在32位PowerPC上,函数描述符实际上是一个96位实体,其中三分之一指向可执行代码,其余的是有助于重新定位模块的数据。

在分段地址空间中,具有大于32位的数据指针可能很有用。 DEC Alpha上的Windows NT是一个32位操作系统,但Alpha硬件具有64位功能。您的普通地址空间仍然是32位,但有一些特殊的API允许32位程序访问64位地址,就像它们处于其他不可访问的段中一样。