在 64 位系统上更大的指针有什么好处?

What is the benefit of larger pointers on 64-bit systems?

我想了解 64 位编译,所以我在 C++ Builder 中做了一些测试:

  int i = 12345;
  ShowMessage(i);
  int *pi = &i;
  ShowMessage(sizeof(pi));


  Largeint li = 9223372036854775807;
  ShowMessage(li);
  Largeint *pli = &li;
  ShowMessage(sizeof(pli));

当我将此程序编译为 64 位时,指针 的大小增加到 8 个字节(64 位)。

增加指针大小有什么好处?

一个指针可以保存内存中单个字节的地址。根据它的大小,您可以计算给定指针可以存储的不同值的最大数量。

使用 4 字节32 位)的指针,您只能访问 4GB 内存,因为:

2^32 = 4294967296

另一方面,8 字节64 位)指针能够寻址范围更广的 17179869184GB理论上:

2^64 = 18446744073709551616

这是 16EB(艾字节)。

实践中,它比,因为大多数处理器和内存的物理大小等的限制。

您可以在此处阅读有关此主题的更多信息:
https://en.wikipedia.org/wiki/64-bit_computing#Limitations_of_practical_processors

除非你想回到内存分页的旧时代(还记得1980年代那些128k RAM的16位Z80机器),或者早期的DOS扩展内存,那么你需要一个32位以上的指针来寻址现代机器上的所有可用内存。

64 位指针是 64 位架构的自然选择(虽然不是必需的)。

请注意,不同类型的指针不必大小相同:sizeof(double*)不必必须与 sizeof(int*) 相同,例如

正如其他答案中所解释的那样,自然而然地就有一个指针类型可以统一无缝地指示内存中的任意位置。

现在如果你有一个复杂的数据结构,在它们之间使用小对象和指针(比如图形,树),当你在 64 位编译时,指针占用的内存会加倍,这是一个缺点(这可能就是你问这个问题的原因)。

请注意,所有这些数据结构(图形、树、散列图等...)也可以在内存中的连续数组中实现,并通过索引访问(例如,FORTRAN 程序员就是这样实现它们的),如果你事先知道你有少于 40 亿个元素,那么你可以将你的索引表示为 32 位整数,即使你在 64 位模式下编译(这就是我正在为 3D 网格建模软件所做的)。