Jaki jest rozmiar wskaźnika w języku C?

Najlepsza odpowiedź

> cat pointersize.c

#include

int main(){

int *ip;

printf(“pointer size: \%zu\n”, sizeof(ip));

}

> cc -o pointersize pointersize.c

> ./pointersize

pointer size: 8

> cc -m32 -o pointersize pointersize.c

> ./pointersize

pointer size: 4

Pointersize zależy tylko od modelu, w którym kompilujesz swój kod. Nie w systemie operacyjnym. Więc mam 64-bitowego Linuksa, ale jeśli zmuszę gcc do kompilacji 32-bitowego kodu, otrzymam 32-bitowy kod ELF i i386 z tylko 4-bajtowym rozmiarem wskaźnika.

Jeśli masz 4 bajty na swoim Windowsie, oznacza to, że wciąż kompilują pliki 32-bitowe i powinieneś znaleźć przełącznik, który uwolni pełny potencjał twojej maszyny. Uwolnij Krakena!

Właśnie przetestowałem, że wczoraj wydajność 32-bitowego kodu i386 i x86\_64 bdver2 (Piledriver, Haswell i nowsze) może być większa niż współczynnik 5 w zwiększaniu prędkości, a nie tylko większy model pamięci. To przeważnie nie jest tak istotne, 4 GB pamięci wystarcza dla większości aplikacji.

Ale z 32-bitowym kodem zaczynasz tracić możliwości MMX, SSE, SSE2,3,4 i wiele postępów w asemblerze w stosunku do ostatnie 35 lat. Oprócz szybszego dostępu do dowolnego transferu danych, manipulacji bitami, operacji na ciągach znaków, zaawansowanych funkcji matematycznych oraz, i, i,…

Chociaż w niektórych przypadkach oryginalny kod x86 jest zaletą: nie można pokonaj ścisły kod!

Edytuj: (i małą rantę, którą możesz zignorować)

W porządku, zawsze sprawdzam wartość takich zdań. Właśnie skompilowałem starszy kod x86\_64 vs 8086. 53 bajty dla x88\_64 vs 74 bajty w starszym kodzie 8086 z małym programem. Cóż… Jeśli utrzymasz 8/16 bitów, może to być prawda. Ale nie w przypadku nowoczesnego oprogramowania, programów w języku C i kompilatorów. Więc nie ma łez z powodu tego, że dawne czasy minęły. Bądźmy szczerzy: byli gówniani. Jedyną dobrą rzeczą było to, że wtedy błyszczałem młodo. Ale miało to inne wady.

Rzecz w tym: nasze nowoczesne procesory są naprawdę fajne. Mamy teraz to, co mieliśmy tylko w naszych snach w latach 80-tych. W końcu mamy wystarczająco duże dyski twarde, że nie obchodzi nas bajt lub dwa. Mamy wystarczająco dużo pamięci, jeśli nie używamy Windowsa ani innych zasobów. Mamy przetwarzanie wektorowe na naszym CPU i całkowite równoległe przetwarzanie na naszych GPU. Mamy wiele rdzeni, matematyczne FPU, wyspecjalizowane rejestry, takie jak MMX, SSE, SSEx, mamy FMA3 i FMA4 (cóż, jeśli masz procesor AMD, przynajmniej musisz długo czekać, aby to zdobyć), my otrzymaliśmy wysoce wyrafinowane kody montażowe, które robią za nas wszystkie fajne rzeczy w mikrokodzie, a nawet w sprzęcie, znacznie częściej niż nie, po prostu robione w jednym cyklu, otrzymaliśmy pamięć podręczną, która jest większa niż cokolwiek, o czym odważyliśmy się marzyć w latach 80-tych .

A „nadchodzącą” rzeczą w latach 80-tych była płyta CD, a pomysł przechowywania niesamowitych gigabajtów na tanim srebrnym talerzu był po prostu niewyobrażalny. Mamy też telefony z komputerami, które są w stanie symulować największe komputery typu mainframe z 1985 roku z 10000 razy ich szybkością czy coś w tym rodzaju.

Teraz mamy wszystko fajne!

Ale co z tym robimy? Twittera 144 znaków. Nikt już nie zna cudów instrukcji montażu naszych zupełnie nowych procesorów. Po prostu usuwamy pieprzony spam i kierujemy systemy Windows, które były oceniane jako „niedługo”, „gówno”, „co robisz z tym gównem” nawet w 1985 roku, kiedy zacząłem się uczyć.

Nie udało się naprawdę poprawiło się w systemie Windows. Wciąż jest to pełne błędów i spamowane złośliwym oprogramowaniem bzdury, które przejmują cuda naszego sprzętu komputerowego, które są tak niesamowite, że jeśli zainstalujesz coś lepiej pasującego do naszych czasów, rozwalisz umysł. Zwłaszcza jako programista.

Rozwój naszych procesorów zwalnia, a na rynku pozostało tylko dwóch konkurentów i powinien być czas, aby naprawdę uwolnić to, co już mamy: wyłącz to 32-bitowe gówno, zacznij optymalizować nasze kod biblioteki w asemblerze, gdzie możemy. Opcjonalnie, zawsze z powrotem do czystego „C”.

A co to kurwa za Twitter? To żart, prawda? 144 znaki ?! To nie jest poważne, czyż nie? Czy zauważyli, jaki mamy sprzęt? Żadnego słowa przeciwko Twitterowi, miła obsługa, ale wiecie, co mam na myśli. Myślą tak cholernie mało i nawet wtedy zawodzą.

Odpowiedź

Znienawidzisz tę odpowiedź.

Gotowa?

To zależy.

Wskaźnik to rozmiar adresu na maszynie, dla której program w C jest kompilowany.

  • Na mikroprocesorze Z80, popularnym w latach osiemdziesiątych, wskaźnik ma 16 bitów.
  • W oryginalnym 8086, wskaźnik może mieć 16, 20 lub 32 bity, mimo że przestrzeń adresowa miała tylko 20 bitów szerokości. Trzeba było podać kompilatorowi C argument wiersza poleceń, który mówił, jak szeroki powinien być wskaźnik. To był koszmar.Poszukaj „ modelu pamięci ” na Wikipedii, aby uzyskać długie i przerażające wprowadzenie.
  • Na mikroprocesorze 68000 wskaźniki były 32-bitowe.
  • W modelu x86 używanym do procesorów Intela do około 5 lat temu i nadal nadającym się do użytku, wskaźnik miał 32 bity, pozwalając na adres około 4 GB. To ograniczenie prowadzi do tworzenia adresów 64-bitowych.
  • W modelu x64 używanym dla procesorów Intela ostatnich kilku generacji wskaźnik ma 64 bity.

Nie można załóżmy, że wskaźnik ma taki sam rozmiar jak int lub taki sam rozmiar jak long. Stała całkowita 0 może zostać przekonwertowana na wskaźnik, ale inne stałe całkowite mogą nie być konwertowane. Podczas konwersji 0 na wskaźnik nie ma gwarancji, że wszystkie bity zawarte we wskaźniku będą zerami, chociaż jest to typowe. To może być wszystko. 0 jest konwertowane na wskaźnik wskazujący na brak prawidłowego adresu. Możesz dodać liczbę całkowitą do wskaźnika, uzyskując wskaźnik, lub odjąć liczbę całkowitą od wskaźnika, uzyskując wskaźnik. Wszystko inne ma nieokreślony skutek.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *