Diese Antwort hängt wirklich davon ab, wer Ihren Code verwenden wird und welche Standards er sehen möchte.
size_t
ist eine Ganzzahl mit einem Zweck:
Der Typ size_t
ist ein implementierungsdefinierter Integer-Typ ohne Vorzeichen, der groß genug ist, um die Größe eines Objekts in Byte zu enthalten. (C ++ 11 Spezifikation 18.2.6)
Wenn Sie also mit der Größe von Objekten in Bytes arbeiten möchten, sollten Sie verwenden size_t
. In vielen Fällen verwenden Sie diese Dimensionen / Indizes nicht zum Zählen von Bytes, aber die meisten Entwickler verwenden sie size_t
aus Konsistenzgründen.
Beachten Sie, dass Sie immer verwenden sollten , size_t
wenn Ihre Klasse das Erscheinungsbild einer STL-Klasse haben soll. Alle STL-Klassen in der Spezifikation verwenden size_t
. Es ist gültig, dass der Compiler typedef size_t
ist unsigned int
, und es ist auch gültig, dass er typedef ist unsigned long
. Wenn Sie int
oder long
direkt verwenden, werden Sie irgendwann auf Compiler stoßen, bei denen eine Person, die glaubt, Ihre Klasse habe den STL-Stil befolgt, gefangen wird, weil Sie den Standard nicht befolgt haben.
Für die Verwendung signierter Typen gibt es einige Vorteile:
- Kürzere Namen - es ist wirklich einfach für die Leute zu tippen
int
, aber viel schwieriger, den Code zu überspielen unsigned int
.
- Eine Ganzzahl für jede Größe - Es gibt nur eine CLS-kompatible Ganzzahl mit 32 Bit, nämlich Int32. In C ++ gibt es zwei (
int32_t
und uint32_t
). Dies kann die API-Interoperabilität vereinfachen
Der große Nachteil signierter Typen liegt auf der Hand: Sie verlieren die Hälfte Ihrer Domain. Eine vorzeichenbehaftete Nummer kann nicht so hoch sein wie eine vorzeichenlose Nummer. Als C / C ++ auf den Markt kam, war dies sehr wichtig. Man musste in der Lage sein, die volle Leistungsfähigkeit des Prozessors zu erreichen, und um dies zu erreichen, musste man vorzeichenlose Zahlen verwenden.
Für die Arten von Anwendungen, auf die .NET abzielt, bestand nicht so stark Bedarf an einem nicht signierten Volldomänenindex. Viele der Zwecke für solche Nummern sind in einer verwalteten Sprache einfach ungültig (man denke an Memory Pooling). Als .NET herauskam, waren 64-Bit-Computer eindeutig die Zukunft. Wir sind noch weit davon entfernt, den vollen Bereich einer 64-Bit-Ganzzahl zu benötigen. Daher ist es nicht mehr so schmerzhaft, ein Bit zu opfern wie zuvor. Wenn Sie wirklich 4 Milliarden Indizes benötigen, wechseln Sie einfach zur Verwendung von 64-Bit-Ganzzahlen. Im schlimmsten Fall läuft es auf einer 32-Bit-Maschine und ist etwas langsam.
Ich sehe den Handel als einen Zweck an. Wenn Sie über genügend Rechenleistung verfügen, um einen Teil Ihres Indextyps zu verschwenden, den Sie niemals verwenden werden, ist es praktisch, ihn nur zu tippen int
oder zu verlassen long
. Wenn Sie feststellen, dass Sie das letzte Stück wirklich wollten, sollten Sie wahrscheinlich auf die Signatur Ihrer Nummern achten.
-1
wird an mehreren Stellen von Funktionen zurückgegeben, die einen Index zurückgeben, um "nicht gefunden" oder "außerhalb des gültigen Bereichs" anzuzeigen. Es wird auch vonCompare()
Funktionen (ImplementierungIComparable
) zurückgegeben. Ein 32-Bit-Int wird als Go-to-Type für eine allgemeine Zahl betrachtet. Ich hoffe, dass dies offensichtliche Gründe sind.