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位)。

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

+13

一个'4'字节的指针只能寻址〜4GB的内存。在现代化计划中,这可能会很快耗尽。 – BoBTFish

+7

指针的大小通常只是反映底层系统。如果您使用的是32位系统,则可以获得32位指针,而在64位系统中,您将获得64位指针。其他任何东西都没有意义。 –

+0

当然,很多64位系统都有32位子系统。这意味着每32位进程有4 GB的限制,但总系统内存可以更多。 – MSalters

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

随着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

+0

“使用4个字节(32位)的指针,您仅限于寻址4GB内存”很好的答案。但为什么会有这个限制? –

+3

我在答案的顶部添加了一些解释。现在清楚了吗?与32位(4字节),你有“只”4294967296可能的值。因此,您可以在内存中寻址4294967296个不同的字节,这是4gb –

+0

,谢谢@oo_miguel –

除非你想回到内存分页的旧时代(记住那些在1980年代有128k RAM的16位Z80机器),或者早期的DOS扩展内存,那么你需要多于32位的指针来处理所有可用的内存在现代机器上。

对于64位体系结构,64位指针是一种自然的(尽管不是必须的)选择。

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

+0

Z80等将具有16位地址范围。 –

+0

修改。我记得那些日子很好;亲切! – Bathsheba

+0

感谢您的回答@Bathsheba –

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

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

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