Die Theorie geht ungefähr so:
uint8_t
muss genau 8 Bit betragen, muss aber nicht vorhanden sein. Sie sollten es daher verwenden, wenn Sie sich auf das Modulo-256-Zuweisungsverhalten * einer 8-Bit-Ganzzahl verlassen und wenn Sie einen Kompilierungsfehler bevorzugen, um sich auf obskuren Architekturen schlecht zu verhalten.
uint_least8_t
muss der kleinste verfügbare vorzeichenlose Integer-Typ sein, der mindestens 8 Bit speichern kann. Sie würden es verwenden, wenn Sie den Speicherbedarf von Dingen wie großen Arrays minimieren möchten.
uint_fast8_t
soll der "schnellste" vorzeichenlose Typ sein, der mindestens 8 Bits speichern kann; Es ist jedoch nicht garantiert, dass es für eine bestimmte Operation auf einem bestimmten Prozessor die schnellste ist. Sie würden es bei der Verarbeitung von Code verwenden, der viele Operationen an dem Wert ausführt.
Die Praxis ist, dass die Typen "schnell" und "am wenigsten" nicht viel verwendet werden.
Die "kleinsten" Typen sind nur dann wirklich nützlich, wenn Sie sich für die Portabilität interessieren, um Architekturen mit CHAR_BIT! = 8 zu verschleiern, was die meisten Leute nicht tun.
Das Problem bei den "schnellen" Typen ist, dass "schnellste" schwer zu bestimmen sind. Ein kleinerer Typ kann eine geringere Belastung des Speicher- / Cache-Systems bedeuten, die Verwendung eines Typs, der kleiner als der native ist, erfordert jedoch möglicherweise zusätzliche Anweisungen. Darüber hinaus kann sich das Beste zwischen den Architekturversionen ändern, aber Implementierer möchten in solchen Fällen häufig vermeiden, dass ABI beschädigt wird.
Aus einigen gängigen Implementierungen geht hervor, dass die Definitionen von uint_fastn_t ziemlich willkürlich sind. glibc scheint sie als mindestens die "native Wortgröße" des fraglichen Systems zu definieren, ohne die Tatsache zu berücksichtigen, dass viele moderne Prozessoren (insbesondere 64-Bit-Prozessoren) eine spezifische Unterstützung für schnelle Operationen an Elementen haben, die kleiner als ihr natives Wort sind Größe. IOS definiert sie anscheinend als äquivalent zu den Typen mit fester Größe. Andere Plattformen können variieren.
Alles in allem sollten Sie, wenn die Leistung von straffem Code mit winzigen Ganzzahlen Ihr Ziel ist, Ihren Code auf den Plattformen, die Sie interessieren, mit unterschiedlich großen Typen vergleichen, um herauszufinden, was am besten funktioniert.
* Beachten Sie, dass das Zuweisungsverhalten von Modulo-256 leider nicht immer eine Modulo-256-Arithmetik impliziert, da C eine Fehlfunktion für die Ganzzahl-Promotion aufweist.
uint8_t
8 Bitsuint_fast8_t
garantiert> = 8 Bits sind, ähnlich wie beiunsigned char
.