2015-11-04 89 views
13

我想了解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

回答

29

指針可以存儲器保持單個字節的地址。根據其大小,您可以計算給定指針可以存儲的不同值的最大數量。

隨着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 –

7

除非你想回到內存分頁的舊時代(記住那些在1980年代有128k RAM的16位Z80機器),或者早期的DOS擴展內存,那麼你需要多於32位的指針來處理所有可用的內存在現代機器上。

對於64位體系結構,64位指針是一種自然的(儘管不是必須的)選擇。

需要注意的是不同類型的的指針不會必須是相同的大小:sizeof(double*)一定必須是相同的sizeof(int*),例如。

+0

Z80等將具有16位地址範圍。 –

+0

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

+0

感謝您的回答@Bathsheba –

2

正如在其他答案中所解釋的,有一個指針類型是很自然的,它可以統一無縫地指示內存中的任意位置。

現在,如果您有一個複雜的數據結構,它們之間使用小對象和指針(如圖,樹),指針所佔用的內存在64位編譯時會加倍,這是一個缺點這可能是你問這個問題的原因)。

請注意,所有這些數據結構(圖形,樹,散列圖等...)也可以在內存中的連續數組中實現,並通過索引訪問(例如FORTRAN程序員如何實現它們),並且如果事先知道您的元素少於40億,那麼您可以將索引表示爲32即使你在64位模式下編譯(這是我爲3D網格建模軟件所做的)。

相關問題