64位系统上较大指针的好处是什么?
我想了解64位编译,所以我也C++ Builder中一个小的测试:64位系统上较大指针的好处是什么?
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
“使用4个字节(32位)的指针,您仅限于寻址4GB内存”很好的答案。但为什么会有这个限制? –
我在答案的顶部添加了一些解释。现在清楚了吗?与32位(4字节),你有“只”4294967296可能的值。因此,您可以在内存中寻址4294967296个不同的字节,这是4gb –
,谢谢@oo_miguel –
除非你想回到内存分页的旧时代(记住那些在1980年代有128k RAM的16位Z80机器),或者早期的DOS扩展内存,那么你需要多于32位的指针来处理所有可用的内存在现代机器上。
对于64位体系结构,64位指针是一种自然的(尽管不是必须的)选择。
需要注意的是不同类型的的指针不会必须是相同的大小:sizeof(double*)
不一定必须是相同的sizeof(int*)
,例如。
正如在其他答案中所解释的,有一个指针类型是很自然的,它可以统一无缝地指示内存中的任意位置。
现在,如果您有一个复杂的数据结构,它们之间使用小对象和指针(如图,树),指针所占用的内存在64位编译时会加倍,这是一个缺点这可能是你问这个问题的原因)。
请注意,所有这些数据结构(图形,树,散列图等...)也可以在内存中的连续数组中实现,并通过索引访问(例如FORTRAN程序员如何实现它们),并且如果事先知道您的元素少于40亿,那么您可以将索引表示为32即使你在64位模式下编译(这是我为3D网格建模软件所做的)。
一个'4'字节的指针只能寻址〜4GB的内存。在现代化计划中,这可能会很快耗尽。 – BoBTFish
指针的大小通常只是反映底层系统。如果您使用的是32位系统,则可以获得32位指针,而在64位系统中,您将获得64位指针。其他任何东西都没有意义。 –
当然,很多64位系统都有32位子系统。这意味着每32位进程有4 GB的限制,但总系统内存可以更多。 – MSalters