Ta odpowiedź naprawdę zależy od tego, kto będzie używał twojego kodu i jakie standardy chcą zobaczyć.
size_t
jest liczbą całkowitą mającą cel:
Typ size_t
jest zdefiniowaną implementacją typu liczba całkowita bez znaku, która jest wystarczająco duża, aby pomieścić rozmiar w bajtach dowolnego obiektu. (Specyfikacja C ++ 11 18.2.6)
Dlatego za każdym razem, gdy chcesz pracować z rozmiarem obiektów w bajtach, powinieneś użyć size_t
. Teraz w wielu przypadkach nie używasz tych wymiarów / indeksów do zliczania bajtów, ale większość programistów decyduje się na użycie size_t
ich dla zachowania spójności.
Pamiętaj, że zawsze powinieneś używać, size_t
jeśli twoja klasa ma wygląd i styl klasy STL. Wszystkie klasy STL w specyfikacji używają size_t
. Jest to ważne dla kompilatora do typedef size_t
być unsigned int
, i to jest również ważne, aby była ona typedefed do unsigned long
. Jeśli użyjesz int
lub long
bezpośrednio, ostatecznie spotkasz się z kompilatorami, w których osoba, która myśli, że twoja klasa postępowała zgodnie ze stylem STL, zostaje uwięziona, ponieważ nie postępujesz zgodnie ze standardem.
Jeśli chodzi o używanie podpisanych typów, jest kilka zalet:
- Krótsze nazwy - pisanie jest naprawdę łatwe
int
, ale znacznie trudniej jest zaśmiecać kod unsigned int
.
- Jedna liczba całkowita dla każdego rozmiaru - Istnieje tylko jedna liczba 32-bitowa zgodna z CLS, czyli Int32. W C ++ są dwa (
int32_t
i uint32_t
). To może uprościć interoperacyjność API
Duża wada podpisanych typów jest oczywista: tracisz połowę swojej domeny. Podpisany numer nie może być liczony tak wysoko jak numer bez znaku. Kiedy pojawiło się C / C ++, było to bardzo ważne. Trzeba było mieć możliwość pełnego wykorzystania możliwości procesora, a do tego trzeba było używać liczb bez znaku.
W przypadku rodzajów aplikacji, na które ukierunkowane jest .NET, nie było tak silnej potrzeby indeksowania niepodpisanego pełnej domeny. Wiele celów takich liczb jest po prostu nieważnych w zarządzanym języku (przychodzi na myśl pula pamięci). Wraz z pojawieniem się platformy .NET 64-bitowe komputery były wyraźnie przyszłością. Jesteśmy daleko od potrzeby pełnego zakresu 64-bitowej liczby całkowitej, więc poświęcenie jednego bitu nie jest tak bolesne jak wcześniej. Jeśli naprawdę potrzebujesz 4 miliardów indeksów, po prostu przełącz się na używanie 64-bitowych liczb całkowitych. W najgorszym przypadku uruchamiasz go na 32-bitowej maszynie i jest on trochę powolny.
Uważam tę wymianę za wygodę. Jeśli akurat masz wystarczającą moc obliczeniową, że nie masz nic przeciwko marnowaniu części swojego indeksu, którego nigdy nie będziesz nigdy używać, to wygodnie jest po prostu wpisać int
lub long
odejść od niego. Jeśli okaże się, że naprawdę tego chciałeś, prawdopodobnie powinieneś zwrócić uwagę na podpis swoich numerów.
-1
zwracane są funkcje zwracające indeks wskazujący „nie znaleziono” lub „poza zakresem”. Jest również zwracany zCompare()
funkcji (implementującychIComparable
). 32-bitowa liczba int jest uważana za typ dla liczby ogólnej, z tego, co mam nadzieję, są oczywiste powody.