2015-11-04 28 views
13

Próbuję zrozumieć 64-bitowych kompilacji, więc zrobiłem mały test w C++ Builder:Jakie zalety mają większe wskaźniki w systemach 64-bitowych?

int i = 12345; 
    ShowMessage(i); 
    int *pi = &i; 
    ShowMessage(sizeof(pi)); 


    Largeint li = 9223372036854775807; 
    ShowMessage(li); 
    Largeint *pli = &li; 
    ShowMessage(sizeof(pli)); 

Kiedy skompilować ten program jako 64 bit, wielkości wskaźnika wzrasta do 8 bajtów (64 bity).

Jaka jest przewaga zwiększonego rozmiaru wskaźnika?

+13

Wskaźnik '4'-bajtowy może adresować tylko ~ 4 GB pamięci. To może szybko zabraknąć w nowoczesnym programie. – BoBTFish

+7

Wielkość wskaźnika zwykle odzwierciedla tylko podstawowy system. Jeśli korzystasz z systemu 32-bitowego, otrzymujesz wskaźniki 32-bitowe, a w systemie 64-bitowym otrzymujesz wskaźniki 64-bitowe. Naprawdę nie ma sensu mieć nic innego. –

+0

Poza tym, że wiele systemów 64-bitowych ma 32-bitowe podsystemy. Oznacza to limit 4 GB na proces 32-bitowy, ale całkowita pamięć systemowa może być znacznie większa. – MSalters

Odpowiedz

29

wskaźnik można trzymać adres pojedynczego bajtu w pamięci. Na podstawie jego wielkości można obliczyć maksymalną liczbę różnych wartości, które dany wskaźnik może przechowywać.

ze wskaźnikiem z 4 bajty (32 bitów) są ograniczone do zajęcia tylko 4GB z pamięci, ponieważ:

2^32 = 4294967296 

Z drugiej strony, 8 bajtów (64-bitowy) wskaźnik jest w stanie adresować znacznie szerszy zakres 17179869184GB teoretycznie:

2^64 = 18446744073709551616 

To są 16EB (exabajty).

W praktyce, jest o wiele mniej niż , że z powodu ograniczeń w większości procesorów i fizyczny rozmiar pamięci itp

Możesz przeczytać więcej na ten temat tutaj:
https://en.wikipedia.org/wiki/64-bit_computing#Limitations_of_practical_processors

+0

"Ze wskaźnikiem 4 bajtów (32 bity) można ograniczyć się tylko do 4 GB pamięci" dobra odpowiedź. Ale dlaczego istnieje ten limit? –

+3

Dodałem małe wyjaśnienie na górze mojej odpowiedzi. czy teraz jest jasne? z 32 bitami (4 bajty) masz "tylko" 4294967296 możliwych wartości. Więc możesz adresować 4294967296 różnych bajtów w pamięci, co jest 4 gb –

+0

dzięki @oo_miguel –

7

Jeśli nie chcesz powracać do dawnych czasów stronicowania pamięci (pamiętaj o tych 16-bitowych komputerach Z80 w latach 80-tych z 128-kami pamięci RAM) lub wczesnej pamięci rozszerzonej DOS, potrzebujesz więcej niż 32-bitowego wskaźnika do adresowania wszystkich dostępnych pamięć na nowoczesnej maszynie.

Wskaźnik 64-bitowy jest naturalnym (choć nie koniecznym) wyborem dla 64-bitowej architektury.

Należy zauważyć, że wskaźniki różnych typów nie muszą być tej samej wielkości: sizeof(double*) nie koniecznie muszą być takie same jak sizeof(int*), na przykład.

+0

Z80 i takie miałyby 16-bitowy zakres adresów. –

+0

Zmienione. Dobrze pamiętam te dni; miłośnie! – Bathsheba

+0

dzięki za odpowiedź @Bathsheba –

2

Jak wyjaśniono w innych odpowiedziach, naturalny jest typ wskaźnika, który może równomiernie i bezproblemowo wskazać dowolną lokalizację w pamięci.

Teraz, jeśli masz skomplikowaną strukturę danych, która używa małych obiektów i wskaźników między nimi (jak wykres, drzewo), pamięć pobrana przez wskaźniki zostanie podwojona podczas kompilacji 64-bitowej, co jest wadą (i prawdopodobnie dlatego zadałeś to pytanie).

Należy pamiętać, że wszystkie te struktury danych (wykres, drzewo, mapa skrótu, itp ...) mogą być również implementowane w sąsiadujących tablicach w pamięci i dostępne za pośrednictwem indeksów (jest to sposób, w jaki programatorzy FORTRAN implementują je na przykład), a jeśli wiesz z góry, że masz mniej niż 4 miliardy elementów, możesz reprezentować swoje indeksy jako 32 bitowe liczby całkowite, nawet jeśli kompilujesz w trybie 64-bitowym (to jest to, co robię dla oprogramowania do modelowania siatki 3D).