Der Grund für typedef
: ed primitive Datentypen besteht darin, die Darstellung auf niedriger Ebene zu abstrahieren und das Verständnis zu erleichtern ( uint64_t
anstelle des long long
Typs, der 8 Byte beträgt).
Es gibt uint_fast32_t
jedoch das gleiche typedef
wie uint32_t
. Wird die Verwendung der "schnellen" Version das Programm beschleunigen?
Antworten:
int
kann auf einigen Plattformen bis zu 16 Bit betragen. Dies ist möglicherweise nicht ausreichend für Ihre Bewerbung.uint32_t
ist nicht garantiert zu existieren. Es ist optional,typedef
dass die Implementierung Folgendes bereitstellen muss, wenn sie einen vorzeichenlosen Integer-Typ von genau 32 Bit hat. Einige haben zum Beispiel 9-Bit-Bytes, also keineuint32_t
.uint_fast32_t
gibt Ihre Absicht klar an: Es handelt sich um einen Typ von mindestens 32 Bit, der aus Sicht der Leistung der beste ist.uint_fast32_t
kann tatsächlich 64 Bit lang sein. Es liegt an der Umsetzung.Was Sie sehen, ist nicht der Standard. Es ist eine bestimmte Implementierung (BlackBerry). Daraus kann man also nicht ableiten, dass
uint_fast32_t
es immer dasselbe ist wieuint32_t
.Siehe auch:
Exotische Architekturen, die den Normungsgremien am Herzen liegen .
Meine meinungsbasierte pragmatische Ansicht von Ganzzahltypen in C und C ++ .
quelle
uint_least32_t
derselbe ist,uint_fast32_t
außer dass er eher einen kleineren Laden als eine Geschwindigkeit bevorzugt.Der Unterschied liegt in der Genauigkeit und Verfügbarkeit.
Der Arzt hier sagt:
Und
Der Unterschied ist also ziemlich klar, dass
uint32_t
es sich um einen Typ handelt, der genau32
Bits enthält, und eine Implementierung sollte ihn nur bereitstellen, wenn er einen Typ mit genau 32 Bits hat, und dann kann er diesen Typ als definierenuint32_t
. Dies bedeutet, dassuint32_t
möglicherweise verfügbar ist oder nicht .Auf der anderen Seite
uint_fast32_t
handelt es sich um einen Typ mit mindestens 32 Bit, was auch bedeutet, dass eine Implementierung typedef kann,uint32_t
alsuint_fast32_t
ob sie bereitstelltuint32_t
. Wenn dies nicht der Fall ist,uint32_t
kann esuint_fast32_t
sich um ein typedef eines beliebigen Typs handeln, der mindestens32
Bits enthält.quelle
uint32_t
ist genau 32-Bit auf allen Systemen (falls vorhanden), was möglicherweise nicht schneller ist als das mit beispielsweise 64-Bit.uint_fast32_t
Auf der anderen Seite könnten mindestens 32 Bit sogar 64 Bit sein.uint16_t x;
in einem 32-Bit-Register auf dem ARM7-TDMI gespeichert wird, muss der Codex++;
möglicherweise als ausgewertet werdenx=((x+1)<<16)>>16);
. Auf Compilern für diese Plattformuint_fast16_t
würde höchstwahrscheinlich als synonym mit definiertuint32_t
, um dies zu vermeiden.[u]int_(fast|least)N_t
nicht auch optional? Sicherlich werden vom Standard nicht alle Architekturen benötigt, um primitive Typen von mindestens 64 Bit zu unterstützen? Der Wortlaut fürstdint.h
impliziert jedoch, dass sie müssen. Es scheint mir seltsam, dass wir dies seit 1999 durchsetzen, einige Jahre bevor 64-Bit-Computing zum Mainstream wurde - ganz zu schweigen von der Verzögerung, die hinter der (in vielen Fällen immer noch aktuellen) eingebetteten Architektur zurückbleibt. Dies scheint mir ein großes Versehen zu sein.Wenn Sie
#include inttypes.h
in Ihrem Programm sind, erhalten Sie Zugriff auf eine Reihe verschiedener Möglichkeiten zur Darstellung von Ganzzahlen.Der Typ uint_fast * _t definiert einfach den schnellsten Typ für die Darstellung 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 vom Typint
. Durch Definieren einer Variablen als Typuint_fast*t
wählt der Computer einfach die effizienteste Darstellung aus, mit der er arbeiten kann.Wenn es keinen Unterschied zwischen diesen Darstellungen gibt, wählt das System die gewünschte aus und verwendet sie durchgehend konsistent.
quelle
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 dergleichen: aber es wird mehr Speicher verbrauchen. Wenn Sie große Arrays davon haben, wird Ihr Programm aufgrund von mehr Speicher-Cache-Treffern und Bandbreite langsamer.
Ich denke nicht, dass moderner CPUS von fast_int32 profitieren wird, da im Allgemeinen die Vorzeichenerweiterung von 32 auf 64 Bit während des Ladebefehls auftreten kann und die Idee, dass es ein "natives" Ganzzahlformat gibt, das schneller ist, altmodisch ist.
quelle