Jestem taki zdezorientowany size_t
. Szukałem w Internecie i wszędzie wspomniałem, że size_t
jest to typ bez znaku, więc może reprezentować tylko wartości nieujemne.
Moje pierwsze pytanie brzmi: jeśli jest używany do reprezentowania tylko wartości nieujemnych, dlaczego nie użyjemy go unsigned int
zamiast size_t
?
Moje drugie pytanie brzmi: są size_t
i unsigned int
wymienne, czy nie? Jeśli nie, to dlaczego?
Czy ktoś może podać mi dobry przykład size_t
i pokrótce jego działanie?
typedef /*This part is implementation dependent */ size_t;
Odpowiedzi:
Ponieważ
unsigned int
nie jest to jedyny typ liczby całkowitej bez znaku.size_t
może być dowolnegounsigned char
,unsigned short
,unsigned int
,unsigned long
lubunsigned long long
, w zależności od implementacji.Nie są one zamienne z powodów wyjaśnionych powyżej
^^
.Nie do końca rozumiem, co masz na myśli, mówiąc „jego krótka praca”. Działa jak każdy inny typ bez znaku (w szczególności taki jak typ, do którego jest przypisany). Zachęcamy do używania,
size_t
gdy opisujesz rozmiar obiektu. W szczególnościsizeof
operator i różne standardowe funkcje biblioteczne, takie jakstrlen()
returnsize_t
.Bonus: oto dobry artykuł na temat
size_t
(i blisko powiązanyptrdiff_t
typ). To bardzo dobrze uzasadnia, dlaczego warto go używać.źródło
size_t
byćunsigned char
? Czy to jest w standardzie, że jest to dozwolone? Mam na myśli ten pomysł, jak można było oczekiwać, że ktokolwiek użyjecalloc()
(i rodziny)strlen()
itp.? Wydaje mi się to absurdalne.size_t
jest zdefiniowany w standardzie jako „typ liczby całkowitej bez znaku”, ale nie wymaga, aby był taki sam jak którykolwiek zunsigned {char, short, int, long, long long}
.Istnieje 5 standardowych typów liczb całkowitych bez znaku w języku C:
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
z różnymi wymaganiami dotyczącymi ich rozmiarów i zakresów (krótko mówiąc, zakres każdego typu jest podzbiorem zakresu następnego typu, ale niektóre z nich mogą mieć ten sam zakres).
size_t
jesttypedef
(tj. aliasem) dla jakiegoś typu bez znaku (prawdopodobnie jeden z powyższych, ale prawdopodobnie rozszerzony typ całkowity bez znaku , chociaż jest to mało prawdopodobne). Jest to typ uzyskiwany przezsizeof
operatora.W jednym systemie sensowne może być użycie
unsigned int
do reprezentowania rozmiarów; z drugiej, bardziej sensowne może być użycieunsigned long
lubunsigned long long
. (size_t
raczej nie będzie tounsigned char
albounsigned short
, ale jest to dozwolone).Celem programu
size_t
jest zwolnienie programisty z konieczności martwienia się o to, który z predefiniowanych typów jest używany do reprezentowania rozmiarów.Kod, który zakłada, że
sizeof
daje wynik iunsigned int
nie byłby przenośny. Kod, który zakłada, że daje wynik,size_t
jest bardziej prawdopodobny do przenoszenia.źródło
unsigned int
,unsigned long
itp), któresize_t
odpowiada zależy od maszyny, na której prowadzony jest kod? tj. na jednej architekturze maszyny odpowiada,unsigned int
ale na innej architekturze będzie odpowiadaćunsigned long
itd.?size_t
, szczególnie jeśli, na przykład,unsigned long
iunsigned long long
są tej samej wielkości.long
,long long
itd. Nie zależą od systemu: Jeśli przyjrzeć sięlimits.h
będzie przynajmniej pod Uniksów zobaczyć, że maksymalna wartość dla wskazówki zależy od wielkości słowo systemu.size_t
ma określone ograniczenie.Cytat z http://www.cplusplus.com/reference/cstring/size_t/ :
Nie można go stosować zamiennie z,
unsigned int
ponieważ rozmiarint
jest określony przez model danych. Na przykład LLP64 używa wersji 32-bitowej,int
a ILP64 używa wersji 64-bitowejint
.źródło
size_t służy do przechowywania rozmiarów obiektów danych i gwarantuje, że będzie w stanie pomieścić rozmiar dowolnego obiektu danych, który może utworzyć dana implementacja języka C. Ten typ danych może być mniejszy (pod względem liczby bitów), większy lub dokładnie taki sam jak unsigned int.
źródło
Oprócz innych odpowiedzi dokumentuje również kod i mówi ludziom, że mówisz o rozmiarze obiektów w pamięci
źródło
apple
to jabłko , asize_t
to rozmiar ...Typ size_t jest podstawowym typem liczby całkowitej bez znaku języka C / C ++. Jest to typ wyniku zwracanego przez operator sizeof. Rozmiar typu jest tak dobrany, aby mógł przechowywać maksymalny rozmiar teoretycznie możliwej tablicy dowolnego typu. W systemie 32-bitowym size_t zajmie 32 bity, na 64-bitowym 64 bity. Innymi słowy, zmienna typu size_t może bezpiecznie przechowywać wskaźnik. Wyjątkiem są wskaźniki do funkcji klasowych, ale jest to szczególny przypadek. Chociaż size_t może przechowywać wskaźnik, lepiej jest użyć do tego celu innego typu liczby całkowitej bez znaku uintptr_t (jego nazwa odzwierciedla jego możliwości). Typy size_t i uintptr_t są synonimami. Typ size_t jest zwykle używany do liczników pętli, indeksowania tablic i arytmetyki adresów. Maksymalna możliwa wartość typu size_t to stała SIZE_MAX.
źródło
size_t
może przechowywać rozmiar dowolnego pojedynczego obiektu. Wskaźnik może wskazywać na dowolny bajt dowolnego obiektu. Możesz mieć system z, na przykład, 64-bitową przestrzenią adresową, która ogranicza rozmiar dowolnego obiektu do 2 ** 32-1 bajtów. Nie ma gwarancji, żesize_t
iuintptr_t
są tego samego typu.W prostych słowach size_t jest zależne od platformy i implementacji, podczas gdy unsigned int jest zależny tylko od platformy.
źródło