2012-03-10 12 views
7

Zastanawiam się, dlaczego ten size_t jest używany, gdzie mogę użyć powiedzieć typu int. Mówi się, że size_t jest typem zwrotnym operatora sizeof. Co to znaczy? tak jak jeśli użyję sizeof(int) i zapiszę, jaki jest jego powrót do zmiennej typu int, to również działa, nie jest konieczne przechowywanie jej w zmiennej typu size_t. Właśnie wyraźnie chcą znać podstawowe pojęcia z użyciem size_t z wyraźną example.Thanksmoże ktoś wyjaśnić, dlaczego typ size_t jest używany z przykładem?

+0

Możesz użyć int do przechowywania zwrotu sizeof w taki sam sposób, w jaki czasami możesz przechowywać 2147483647 w int. Tak się składa, że ​​rozmiary właściwe dla danej implementacji są poprawne. – Lalaland

+0

Zobacz także to pytanie: http://stackoverflow.com/questions/918787/whats-sizeofsize-t-on-32-bit-vs-the-various-64-bit-data-models – ChrisWue

+0

Czy ktoś może potwierdzić, że size_t jest taki sam rozmiar rejestrów procesorów? – arthurprs

Odpowiedz

9

size_t jest gwarantowane, aby móc reprezentować największy rozmiar to możliwe, int nie jest. Oznacza to, że size_t jest bardziej przenośny.

Na przykład, co jeśli int może przechowywać tylko do 255, ale można przydzielić tablice 5000 bajtów? Najwyraźniej to by nie działało, ale będzie to miało miejsce z size_t.

+1

Technicznie "int" musi mieć co najmniej 16 bitów, jak musi wynosić co najmniej zakres [-32767..32767]. (Dlaczego nie -32768? Aby dopasować swoje systemy uzupełniania i znakowania do wielkości, na wypadek, gdyby ktoś chciał używać C na starej maszynie Univac, oczywiście mają one 18- i 36-bitowe liczby całkowite, z 9-bitowymi '' '' ' char''.) – torek

+0

@torek Z jakiegoś powodu mam wrażenie, że int musi być> 16 w C, nie w C++. Nie sprawdziłem jednak standardu. – Pubby

+0

@Pubby: C++ dziedziczy, że z C. 1.1 p2 C++ jest językiem programowania ogólnego przeznaczenia opartym na języku programowania C opisanym w ISO/IEC 9899: 1999 Języki programowania

4

Najprostszym przykładem jest dość dnia: w systemie starej 16-bitowo int z 64 K pamięci RAM, wartość składnika int może być wszędzie od -32768 do +32767, ale po:

char buf[40960]; 

Bufor buf zajmuje 40 KB, więc sizeof buf jest zbyt duży, aby zmieścić się w int i potrzebuje unsigned int.

To samo może zdarzyć się dzisiaj, jeśli używasz 32-bitowej int ale pozwalają programom na dostęp do więcej niż 4 GB pamięci RAM na raz, jak to ma miejsce na tak zwane modele „I32LP64” (32 bit int, 64 -bit long i wskaźnik). Tutaj typ size_t będzie miał taki sam zakres, jak unsigned long.

0

Jest to implementacja zdefiniowana, ale na systemach 64-bitowych okaże się, że size_t jest często 64-bitowy, podczas gdy int jest nadal 32-bitowy (chyba że jest to model ILP64 or SILP64).

1

można wykorzystać size_t głównie do odlewania wskaźniki do liczb całkowitych bez znaku tego samego size, aby wykonywać obliczenia na wskaźnikach tak, jakby były liczbami całkowitymi, które w przeciwnym razie byłyby uniemożliwione podczas kompilacji. Taki kod jest przeznaczony do kompilowania i budowania poprawnie w kontekście różnych rozmiarów wskaźników, np. Model 32-bitowy a 64-bitowy.

Powiązane problemy