Smart typedefs

8

Ich habe typedef immer in eingebetteter Programmierung verwendet, um häufige Fehler zu vermeiden:

int8_t - 8 Bit vorzeichenbehaftete Ganzzahl
int16_t - 16 Bit vorzeichenbehaftete Ganzzahl
int32_t - 32 Bit vorzeichenbehaftete Ganzzahl
uint8_t - 8 Bit vorzeichenlose Ganzzahl
uint16_t - 16 Bit vorzeichenlose Ganzzahl
uint32_t - 32 Bit vorzeichenlose Ganzzahl

Die letzte eingebettete Muse (Ausgabe 177, noch nicht auf der Website) hat mich zu der Idee gebracht, dass es nützlich ist, einige leistungsspezifische Typedefs zu haben. Dieser Standard schlägt vor, typedefs zu haben, die angeben, dass Sie den schnellsten Typ mit einer Mindestgröße wünschen.

Zum Beispiel könnte man eine Variable mit int_fast16_t deklarieren, aber sie würde tatsächlich als int32_t auf einem 32-Bit-Prozessor implementiert werden, oder int64_t auf einem 64-Bit-Prozessor, da dies die schnellsten Typen wären mindestens 16 Bits auf diesen Plattformen. Auf einem 8-Bit-Prozessor wäre int16_t Bits, um die Mindestgröße zu erfüllen.

Ich habe diese Verwendung noch nie gesehen, bevor ich es wissen wollte

  • Hast du das in irgendwelchen Projekten gesehen, eingebettet oder anders?
  • Mögliche Gründe, diese Art der Optimierung in typedefs zu vermeiden?
Adam Davis 30.03.2009, 15:08
quelle

6 Antworten

4
  

Zum Beispiel könnte man a   Variable mit int_fast16_t, aber es   würde tatsächlich als ein implementiert werden   int32_t auf einem 32-Bit-Prozessor, oder   int64_t auf einem 64-Bit-Prozessor wie diese   wäre die schnellste Art von mindestens   16 Bits auf diesen Plattformen

Dafür ist int da, nicht wahr? Sind Sie wahrscheinlich bald mit einer 8-Bit CPU konfrontiert, wo das nicht ausreichen würde?

Wie viele eindeutige Datentypen können Sie merken ?

Bietet es so viel zusätzlichen Nutzen, dass es sinnvoll ist, die Anzahl der zu berücksichtigenden Typen zu verdoppeln, wenn ich eine einfache Ganzzahlvariable erstelle?

Ich habe es schwer, mir sogar die Möglichkeit vorzustellen, dass es konsistent verwendet werden könnte.

Jemand wird eine Funktion schreiben, die ein int16fast_t zurückgibt, und dann kommt jemand anderes und speichert diese Variable in einem int16_t .

Dies bedeutet, dass in dem obskuren Fall, in dem die schnellen Varianten tatsächlich von Vorteil sind, dies das Verhalten Ihres Codes ändern kann. Es kann sogar Compilerfehler oder Warnungen verursachen.

    
jalf 30.03.2009, 15:18
quelle
4

Schauen Sie sich stdint.h von C99 an.

    
rlbond 30.03.2009 15:09
quelle
3

Der Hauptgrund, warum ich diesen Typdef vermeiden würde, ist, dass der Typ dem Benutzer lügen kann. Nehmen Sie int16_t vs int_fast16_t. Beide Typnamen kodieren die Größe des Wertes in den Namen. Dies ist keine ungewöhnliche Praxis in C / C ++. Ich persönlich benutze die Größe typedefs, um Verwirrung für mich selbst und andere Leute zu vermeiden, die meinen Code lesen. Ein großer Teil unseres Codes muss auf 32- und 64-Bit-Plattformen laufen, und viele Leute kennen die verschiedenen Größenregeln zwischen den Plattformen nicht. Typen wie int32_t eliminieren die Mehrdeutigkeit.

Wenn ich den vierten Absatz Ihrer Frage nicht gelesen hätte und stattdessen nur den Typnamen gesehen hätte, hätte ich angenommen, dass es sich um eine szenariospezifische Methode handelt, einen schnellen 16-Bit-Wert zu haben. Und ich hätte mich offensichtlich geirrt :(. Für mich würde es die "Do not Surprise People" -Regel des Programmierens verletzen.

Vielleicht, wenn es ein anderes Unterscheidungsverb, einen Buchstaben, ein Akronym im Namen hätte, wäre es weniger wahrscheinlich, Benutzer zu verwirren. Vielleicht int_fast16min_t?

    
JaredPar 30.03.2009 15:14
quelle
2

Wenn ich mir int_fast16_t anschaue, und ich bin mir nicht sicher über die native Breite der CPU, auf der es ausgeführt wird, kann es die Sache kompliziert machen, zum Beispiel den Operator ~ .

%Vor%

Irgendwie möchte ich 32 Bit oder 64 Bit basierend auf der nativen Breite des Prozessors verwenden.

    
Alphaneo 31.03.2009 03:19
quelle
0

Ich bin eigentlich kein Fan von so etwas.

Ich habe das schon viele Male gesehen (tatsächlich haben wir sogar diese Typdefinitionen an meinem derzeitigen Arbeitsplatz) ... Zum größten Teil bezweifle ich ihre wahre Nützlichkeit ... Es scheint mir, dass sich Veränderungen ändern Sake ... (und ja, ich weiß, die Größen einiger der eingebauten Ins können variieren) ...

    
dicroce 30.03.2009 15:13
quelle
0

Ich benutze häufig size_t, es ist die schnellste Adressgröße, eine Tradition, die ich beim Einbetten übernommen habe. Und es verursachte nie Probleme oder Verwirrung in eingebetteten Kreisen, aber es begann tatsächlich, mir Probleme zu bereiten, als ich anfing, an 64bit Systemen zu arbeiten.

    
Robert Gould 30.03.2009 15:42
quelle

Tags und Links