Warum verwenden Sie im neuen Code 'int' anstelle von 'int_fast16_t' oder 'int_fast32_t' für eine Zählvariable?

9

Wenn Sie eine Zählvariable benötigen, muss es sicher eine obere und eine untere Grenze geben, die Ihre ganze Zahl unterstützen muss. Warum sollten Sie diese Grenzen nicht angeben, indem Sie einen geeigneten (u) int_fastxx_t-Datentyp wählen?

    
traal 16.04.2017, 20:03
quelle

2 Antworten

4

Der einfachste Grund ist, dass Leute% c0_de% mehr gewohnt sind als die zusätzlichen Typen, die in C ++ 11 eingeführt wurden, und dass es der "standardmäßige" Integraltyp der Sprache ist (so viel wie C ++ hat); Der Standard spezifiziert in int Folgendes:

  

Plain-Ints haben die natürliche Größe, die von der Architektur der Ausführungsumgebung vorgeschlagen wird 46 ; die anderen vorzeichenbehafteten Integer-Typen werden bereitgestellt, um spezielle Anforderungen zu erfüllen.

     

46), das groß genug ist, um einen Wert im Bereich von [basic.fundamental/2] und INT_MIN zu enthalten, wie im Header INT_MAX definiert.

Wenn also eine generische Ganzzahl benötigt wird, die nicht unbedingt einen bestimmten Bereich oder eine bestimmte Größe haben muss, verwenden Programmierer häufig nur <climits> . Während die Verwendung anderer Typen die Absicht deutlicher kommunizieren kann (wenn beispielsweise int angibt, dass der Wert nie int8_t überschreiten sollte), teilt 127 auch mit, dass diese Details für die aktuelle Aufgabe nicht entscheidend sind, während gleichzeitig einen kleinen Spielraum für das Abfangen von Werten zu schaffen, die den erforderlichen Bereich überschreiten (wenn ein System beispielsweise einen vorzeichenbehafteten Überlauf mit Modulo-Arithmetik behandelt, würde int int8_t als 313 behandeln, wodurch der ungültige Wert schwieriger zu behandeln ist); typischerweise zeigt es in der modernen Programmierung entweder an, dass der Wert innerhalb der Wortgröße des Systems dargestellt werden kann (welche 57 repräsentieren soll), oder dass der Wert innerhalb von 32 Bits dargestellt werden kann (was fast immer die Größe von% ist). co_de% auf x86- und x64-Plattformen).

Große Typen haben auch das Problem, dass die (theoretisch) bekanntesten, die int -Zeile, nur auf Plattformen definiert sind, die Größen von genau X-Bits unterstützen. Während die int -Typen garantiert auf allen Plattformen definiert sind und garantiert mindestens X Bits sind, würden viele Leute nicht so viel tippen wollen, wenn sie es nicht müssen, da es sich bei Ihnen addiert müssen oft Typen angeben. [Sie können intX_t nicht verwenden, weil es Ganzzahlliterale als int_leastX_t s erkennt. Dies kann durch die Erstellung benutzerdefinierter Literaloperatoren gemildert werden, aber das erfordert mehr Zeit für die Eingabe. Daher verwenden sie normalerweise auto , wenn dies sicher ist.

Kurz gesagt, int soll der richtige Typ für den normalen Betrieb sein, während die anderen Typen für extranormale Situationen gedacht sind. Viele Programmierer halten sich aus Gewohnheit an diese Denkweise und verwenden nur große Typen, wenn sie explizit bestimmte Bereiche und / oder Größen erfordern. Dies kommuniziert auch die Absicht relativ gut; int bedeutet "Zahl" und int bedeutet "Zahl, die immer in X Bits passt".

Es hilft nicht, dass sich int zu inoffiziell gemeinem "32-Bit-Integer" entwickelt hat, da 32- und 64-Bit-Plattformen normalerweise 32-Bit intX_t s verwenden. Es ist sehr wahrscheinlich, dass viele Programmierer erwarten, dass int in der modernen Zeit immer mindestens 32 Bit sind, bis zu dem Punkt, an dem sie sehr leicht in den Hintergrund beißen können, wenn sie für Plattformen programmieren müssen, die nicht Unterstützung 32-Bit int s.

Umgekehrt werden die Größestypen normalerweise verwendet, wenn ein bestimmter Bereich oder eine bestimmte Größe explizit benötigt wird, z. B. wenn ein int definiert wird, das auf Systemen mit unterschiedlichen Datenmodellen dasselbe Layout haben muss. Sie können sich auch als nützlich erweisen, wenn Sie mit begrenztem Speicher arbeiten und den kleinsten Typ verwenden, der den erforderlichen Bereich vollständig enthalten kann.

Ein int , das zum Beispiel dasselbe Layout auf 16- und 32-Bit-Systemen haben soll, würde entweder struct oder struct anstelle von int16_t verwenden, weil int32_t am meisten 16 Bits hat 16-Bit-Datenmodelle und das 32-Bit-LP32-Datenmodell (verwendet von der Win16-API und Apple-Macintosh), aber 32 Bit im ILP32 32-Bit-Datenmodell (verwendet von den Win32-API- und * nix-Systemen) de facto "Standard" 32-Bit-Modell).

Ebenso würde ein int , das auf 32- und 64-Bit-Systemen dasselbe Layout haben soll, int / struct oder int / int32_t über long long verwenden, da int64_t unterschiedliche Größen in verschiedenen Modellen (64 Bit in LP64 (verwendet von 64-Bit * nix), 32 Bit in LLP64 (verwendet von Win64 API) und die 32-Bit-Modelle).

Beachten Sie, dass es auch ein drittes 64-Bit-Modell gibt, ILP64, wobei long 64 Bits ist; Dieses Modell wird sehr selten verwendet (meines Wissens wurde es nur für frühe 64-Bit-Unix-Systeme verwendet), würde aber die Verwendung eines großen Typs über long vorschreiben, wenn Layoutkompatibilität mit ILP64-Plattformen erforderlich ist.

    
Justin Time 17.04.2017 21:45
quelle
-3

Es gibt mehrere Gründe. Erstens, diese langen Namen machen den Code weniger lesbar. Zweitens, Sie könnten sehr schwer vorstellen, Bugs zu finden. Angenommen, Sie haben int_fast16_t verwendet, aber Sie müssen wirklich bis zu 40.000 zählen. Die Implementierung könnte 32 Bits verwenden und der Code funktioniert gut. Dann versuchen Sie, den Code auf einer Implementierung auszuführen, die 16 Bit verwendet und Sie schwer zu findende Fehler erhalten.

Ein Hinweis: In C / C ++ haben Sie die Typen char, short, int, long und long long, die 8 bis 64 Bits umfassen müssen, also kann int nicht 64 Bits sein (weil char und short 8, 16 und 32 Bits nicht abdecken können) ), auch wenn 64 Bits die natürliche Wortgröße sind. In Swift zum Beispiel ist Int die natürliche Integer-Größe, entweder 32 oder 64 Bit, und Sie haben Int8, Int16, Int32 und Int64 für explizite Größen. Int ist der beste Typ, es sei denn, Sie benötigen unbedingt 64 Bit. In diesem Fall verwenden Sie Int64 oder wenn Sie Speicherplatz sparen müssen.

    
gnasher729 16.04.2017 20:11
quelle

Tags und Links