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

İsm*_*can 14 c++ 64-bit pointers c++builder

我试图理解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));
Run Code Online (Sandbox Code Playgroud)

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

指针大小增加的优点是什么?

oo_*_*uel 29

指针可以保持地址中的单个字节的存储器.根据其大小,您可以计算给定指针可以存储的不同值的最大数量.

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

2^32 = 4294967296
Run Code Online (Sandbox Code Playgroud)

另一方面,一个8字节(64位)指针能够在理论上解决更广泛的17179869184GB范围:

2^64 = 18446744073709551616
Run Code Online (Sandbox Code Playgroud)

这是16EB(exabytes).

实践中,它是非常,因为在大多数处理器和内存等的物理尺寸的限制比,

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

  • @İsmailKocacan你甚至不需要物理RAM来从中受益 - 在任何现代操作系统中,所有进程内存都是虚拟化的.在物理RAM耗尽之前很久就会耗尽虚拟地址空间.例如,默认情况下,32位窗口上的32位应用程序只能生成大约2000个线程 - 即使每个线程只占用大约4 kiB的RAM,它们也占用大约1 MiB的地址空间.当然,你不管怎样都不需要2000个线程,但是还有其他地方需要占用地址空间而不需要RAM(而不仅仅是使用分页文件). (5认同)
  • 我在答案的顶部添加了一些解释.现在很清楚吗?在32位(4字节)中,您只有"仅"4294967296个可能的值.因此,您可以在内存中寻址4294967296个不同的字节,即4gb (3认同)

Bat*_*eba 7

除非你想回到过去的内存分页(记得20世纪80年代的那些16位Z80机器有128k RAM),或者早期的DOS扩展内存,那么你需要不止一个32位指针来解决所有可用内存的问题.一台现代机器.

64位指针是64位架构的自然选择(尽管不是必需的).

需要注意的是不同类型的指针必须是相同的大小:sizeof(double*)并不一定必须是相同的sizeof(int*),例如.