Aby size_t
dowiedzieć się, dlaczego musi istnieć i jak się tu dostaliśmy:
W kategoriach pragmatycznych size_t
i ptrdiff_t
są gwarantowane do 64 bitów szerokości na realizację 64-bitowej, 32 bity szeroki na realizację 32-bitowej, i tak dalej. Nie mogli zmusić żadnego istniejącego typu, aby oznaczał to w każdym kompilatorze bez zerwania starszego kodu.
A size_t
lub ptrdiff_t
niekoniecznie jest taki sam jak intptr_t
lub uintptr_t
. Byli różni się w niektórych architekturach, które były nadal w użyciu, kiedy size_t
i ptrdiff_t
zostały dodane do standardowego w późnych latach 80., kiedy stają się przestarzałe i C99 dodano wiele nowych typów, ale jeszcze nie przeszły (takie jak 16-bitowym systemie Windows). 16-bitowy tryb chroniony x86 miał pamięć segmentową, w której największa możliwa tablica lub struktura mogła mieć jedynie 65 536 bajtów, ale far
wskaźnik musiał mieć szerokość 32 bitów, więcej niż rejestry. Na nich intptr_t
miałby 32 bity szerokości, ale size_t
iptrdiff_t
może mieć 16 bitów szerokości i zmieścić się w rejestrze. A kto wiedział, jaki system operacyjny może zostać napisany w przyszłości? Teoretycznie architektura i386 oferuje 32-bitowy model segmentacji z 48-bitowymi wskaźnikami, których żaden system operacyjny nigdy nie używał.
Typ przesunięcia pamięci nie może być, long
ponieważ o wiele za dużo starszego kodu zakłada się, że long
ma on dokładnie 32 bity. To założenie zostało nawet wbudowane w interfejsy API UNIX i Windows. Niestety, wiele innych starszych kodów również zakładało, że a long
jest wystarczająco szerokie, aby pomieścić wskaźnik, przesunięcie pliku, liczbę sekund, które upłynęły od 1970 roku i tak dalej. POSIX zapewnia teraz ustandaryzowany sposób na wymuszenie, aby to drugie założenie było prawdziwe zamiast pierwszego, ale nie jest to również przenośne założenie.
Nie mogło być tak, int
ponieważ tylko niewielka garść kompilatorów w latach 90. miała int
64 bity szerokości. Potem naprawdę się dziwili, utrzymując long
szerokość 32 bitów. Kolejna wersja Standardu uznała, że jest niezgodna z prawem, ponieważ int
jest szersza niż long
, ale int
nadal ma 32 bity szerokości w większości systemów 64-bitowych.
Nie mogło być long long int
, co zresztą zostało dodane później, ponieważ zostało utworzone tak, aby miało szerokość co najmniej 64 bitów, nawet w systemach 32-bitowych.
Potrzebny był więc nowy typ. Nawet gdyby tak nie było, wszystkie inne typy oznaczały coś innego niż przesunięcie w tablicy lub obiekcie. A jeśli była jedna lekcja z fiasku migracji od 32 do 64 bitów, to musiała być konkretna, jakie właściwości powinien mieć typ, a nie używać takiej, która oznaczała różne rzeczy w różnych programach.
int
ifsome_size
jest podpisane,size_t
jeśli nie jest podpisane.