webentwicklung-frage-antwort-db.com.de

Was ist uint_fast32_t und warum sollte es anstelle des regulären int und uint32_t verwendet werden?

Der Grund für typedef: ed-primitive Datentypen besteht also darin, die Low-Level-Darstellung zu abstrahieren und das Verständnis zu erleichtern (uint64_t statt long long-Typ, also 8 Byte). 

Es gibt jedoch uint_fast32_t, der dieselbe typedef wie uint32_t hat. Wird die "schnelle" Version das Programm schneller machen?

91
Amumu
  • int kann auf einigen Plattformen bis zu 16 Bit betragen. Für Ihre Bewerbung reicht es möglicherweise nicht aus.
  • uint32_t ist nicht garantiert zu existieren. Es ist eine optionale typedef, die die Implementierung bereitstellen muss, wenn sie einen vorzeichenlosen Integer-Typ mit genau 32 Bit hat. Einige haben beispielsweise 9-Bit-Bytes, daher haben sie keinen uint32_t.
  • uint_fast32_t legt klar Ihre Absicht fest: Es handelt sich um eine Art von mindestens 32 Bit, was aus Sicht der Leistung die beste ist. uint_fast32_t kann tatsächlich 64 Bit lang sein. Es liegt an der Implementierung.

... gibt es uint_fast32_t, der den gleichen Typ wie uint32_t hat ...

Was Sie betrachten, ist nicht der Standard. Es ist eine bestimmte Implementierung (BlackBerry). Sie können also nicht davon ausgehen, dass uint_fast32_t immer dasselbe ist wie uint32_t.

Siehe auch:

110
ybungalobill

Der Unterschied liegt in ihrer Genauigkeit und Verfügbarkeit.

Das doc hier sagt:

ganzzahliger Typ ohne Vorzeichen mit einer Breite von genau 8, 16, 32 und 64 Bit (nur angegeben, wenn die Implementierung direkt den Typ unterstützt): 

uint8_t
uint16_t
uint32_t
uint64_t

Und

schnellster vorzeichenloser vorzeichenloser Integer-Typ mit einer Breite von mindestens 8, 16, 32 bzw. 64 Bit

uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t    

Der Unterschied ist also ziemlich klar, dass uint32_t ein Typ ist, der genau32-Bits hat, und eine Implementierung sollte es nur wenn geben, es hat einen Typ mit genau 32 Bits, und dann kann dieser Typ als uint32_t eingegeben werden. Dies bedeutet, dass uint32_tverfügbar sein kann oder nicht.

Andererseits ist uint_fast32_t ein Typ mit mindestens 32 Bits, was auch bedeutet, wenn eine Implementierung uint32_t als uint_fast32_teingeben kann, wenn sie uint32_t bereitstellt. Wenn uint32_t nicht angegeben ist, könnte uint_fast32_t ein Typdef eines beliebigen Typs sein, der mindestens 32-Bits enthält.

32
Nawaz

Wenn Sie in Ihrem Programm #include inttypes.h sind, haben Sie Zugriff auf eine Reihe von verschiedenen Arten, Ganzzahlen darzustellen.

Der Typ uint_fast * _t definiert einfach den schnellsten Typ zum Darstellen einer bestimmten Anzahl von Bits. 

Stellen Sie sich das so vor: Sie definieren eine Variable vom Typ short und verwenden sie mehrmals im Programm, was völlig gültig ist. Das System, an dem Sie arbeiten, arbeitet jedoch möglicherweise schneller mit Werten des Typs int. Durch die Definition einer Variablen als Typ uint_fast*t wählt der Computer einfach die effizienteste Darstellung aus, mit der er arbeiten kann. 

Wenn zwischen diesen Darstellungen kein Unterschied besteht, wählt das System die gewünschte Darstellung aus und verwendet sie durchgängig.

2
Harley Sugarman

Beachten Sie, dass die schnelle Version größer als 32 Bit sein kann. Das schnelle int passt zwar gut in ein Register und wird ausgerichtet und ähnliches: aber es wird mehr Speicherplatz benötigt. Wenn Sie über große Arrays verfügen, wird Ihr Programm aufgrund von mehr Cache-Treffern und Bandbreite langsamer.

Ich glaube nicht, dass der moderne CPUS von fast_int32 profitieren wird, da im Allgemeinen die Vorzeichenerweiterung von 32 auf 64 Bit während des Ladebefehls passieren kann und die Vorstellung, dass es ein 'natives' Integer-Format gibt, das schneller ist, altmodisch.

0
Gil Colgate