我正在尝试理解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位)。
增加指针大小的优点是什么?
答案 0 :(得分:29)
指针可以保存内存中单个字节的地址。根据其大小,您可以计算给定指针可以存储的不同值的最大数量。
如果指针 4个字节( 32位),则仅限地址 4GB ,因为:
2^32 = 4294967296
另一方面, 8字节( 64位)指针能够在理论上解决更广泛的 17179869184GB 范围:< / p>
2^64 = 18446744073709551616
16EB (exabytes)。
在练习中,由于大多数处理器的限制以及内存的物理尺寸等因此 。
您可以在此处详细了解此主题:
https://en.wikipedia.org/wiki/64-bit_computing#Limitations_of_practical_processors
答案 1 :(得分:7)
除非你想回到旧时的内存分页(记得那些20世纪80年代的16位Z80机器有128k RAM),或早期的DOS扩展内存,那么你需要超过32位指针来解决所有的问题。现代机器上的可用内存。
64位指针是64位架构的自然选择(尽管不是必需的)。
请注意,不同类型的指针不必须具有相同的尺寸:sizeof(double*)
必然必须与{{1}相同例如。
答案 2 :(得分:2)
正如其他答案所解释的那样,很自然地有一个指针类型可以统一无缝地指示存储器中的任意位置。
现在,如果你有一个复杂的数据结构,使用它们之间的小对象和指针(如图形,树),当你用64位编译时,指针占用的内存将加倍,这是一个缺点(和这可能是你问这个问题的原因。
请注意,所有这些数据结构(图形,树,哈希映射等)也可以在内存中的连续数组中实现,并通过索引访问(例如FORTRAN程序员如何实现它们),如果你事先知道你有少于40亿个元素,那么你可以将你的索引表示为32位整数,即使你在64位模式下编译(这就是我正在为3D网格建模软件做的事情)。 p>