stdint.h: uint8_t oder unsigned __int8, fast & least?
-
Sers COM,
kurze Fragen:
1.)unsigned __int8 oder uint8_t?
ich überlege gerade, welche Schreibweise ich verwenden soll:unsigned __int8 Test1 = 8;
oder
uint8_t Test2 = 8;
???
1.1)
Welche Schreibweise ist wann und warum zu bevorzugen?
Sind die typedefs wie __int8, __int16, __int32, __int64 denn überhaupt C/C++-Standard?
Die anderen Typen (uint8_t, int8_t, etc.) sind ja Bestandteil einer C/C++-Bibliothek, da ist das ja egal, include und gut is.1.2)
Bei den "_t"-Typen aus der stdint.h hängt es von der verwendeten C/C++-Bibliothek ab, ob das einfache typedefs oder structs sind. I.d.R. bedeutet ja "_t" in der Bezeichnung, dass es sich eher um ein struct handelt (nicht zwingend).
Mich würde mal interessieren, wie das perfmormancemäßig ausschaut.
Ist ein struct gegenüber einem skalaren Datentyp langsamer in der Ausführung?2.) int_fastN_t und stdint.h?
2.1) fast-Datentypen?
Um was handelt es sich denn bei den fast-Datentypen?
Ich lese nur ständig sowas wie "der schnellste int-Typ mit mindestens einer Breite von N Bits.". Aber was ist damit genau gemeint? Ebenso finde ich keine passenden guten Beispiele, wo man sich deren Anwendung genauer anschauen könnte.
Wäre super, wenn mich hier mal jemand aufklären könnte.
Inwieweit sind diese Datentypen "schneller" und worin unterscheiden sich diese von den anderen Nicht-fast-Datentypen?2.2)
Ebenso die int_leastN_t-Datentypen, "ein int-Wert mit einer Breite von mindestens N Bits". MINDESTENS? Wie soll man sich das vorstellen???
Sage ich bei den normalen [u]intN-Datentypen, z.B. int16_t, dann sind doch auch eindeutig 16-Bit-Datentypen festgelegt. Da gibt es kein mindestens oder maximal, ist doch alles eindeutig bestimmt??? Wo sind auch hier die Unterschiede zu normalen Datentypen?Ich danke vielmals im Voraus!
MfG
Schlitzauge
-
1.1)
Sind die typedefs wie __int8, __int16, __int32, __int64 denn überhaupt C/C++-Standard?
Nein.
Und btw., ich bin mir sicher,__int8
undint8_t
sind in der Praxis ein Typedef auf den gleichen Typ:signed char
. Alles andere wäre komisch.1.2)
Bei den "_t"-Typen aus der stdint.h
Ähhemm, bitte die
<cstdint>
einbinden.hängt es von der verwendeten C/C++-Bibliothek ab, ob das einfache typedefs oder structs sind. I.d.R. bedeutet ja "_t" in der Bezeichnung, dass es sich eher um ein struct handelt (nicht zwingend).
Nein, _t heißt gar nichts, und ich bin mir sicher, auf 100% aller Implementierungen ist das standardkonform ein Typedef.
Mich würde mal interessieren, wie das perfmormancemäßig ausschaut.
Ist ein struct gegenüber einem skalaren Datentyp langsamer in der Ausführung?Hä? So pauschal kann das doch keiner beantworten...
(Kommt drauf an, was für ein struct, hat er virtuelle Funktionen, usw.)2.) int_fastN_t und stdint.h?
2.1) fast-Datentypen?Um was handelt es sich denn bei den fast-Datentypen?
Standard schrieb:
The typedef name int_fastN_t designates the fastest signed integer type with a width of at least N.
Sprich, die Größe kann viel größer sein als N Bits, bspw. kann int_fast8_t auch 32-Bit groß sein (oder wie groß das Maschinenwort auf der Maschine eben ist), wenn das schneller ist.
Ebenso die int_leastN_t-Datentypen, "ein int-Wert mit einer Breite von mindestens N Bits". MINDESTENS? Wie soll man sich das vorstellen???
Standard schrieb:
The typedef name int_leastN_t designates a signed integer type with a width of at least N, such that no signed integer type with lesser size has at least the specified width. Thus, int_least32_t denotes a signed integer type with a width of at least 32 bits.
Dies ist ein Typedef auf den kleinsten Datentyp, der mindestens N Bits hat. Auf einer 40-Bit Maschine gibt es vielleicht CHAR_BIT = 10, dann wird char auch 10-bit groß sein. Da gibt es keinen 8-Bit großen Datentyp. Aber eben einen, der mindestens so groß ist. Mit diesen Datentypen sagt man: Die genaue Größe ist mir egal, aber es sollte so klein wie möglich sein und mindestens N-Bit haben.
-
Nein, _t heißt gar nichts, und ich bin mir sicher, auf 100% aller Implementierungen ist das standardkonform ein Typedef.
Man beachte schon mein "I.d.R." und "(nicht zwingend)"!
In diversen Büchern und im Netz findet man zu solchen Namenskonventionen entsprechende Aussagen. Natürlich ist mir bewusst, dass dies kein Muss, sondern ein Kann ist, aber das erwähnte ich ja bereits.zu 1.1)
Ok, und wann bzw. auch warum ist dann welche Schreibweise zu bevorzugen?
Mir ist schon bewusst, dass im Falle von typedefs auf ein und denselben Datentyp es egal ist, aber grundlos wird es beide Schreibweisen wohl nicht geben. Mich würden aber schon Eure Empfehlungen dazu interessieren.zu 2.)
Standard schrieb:
The typedef name int_fastN_t designates the fastest signed integer type with a width of at least N.
Sprich, die Größe kann viel größer sein als N Bits, bspw. kann int_fast8_t auch 32-Bit groß sein (oder wie groß das Maschinenwort auf der Maschine eben ist), wenn das schneller ist.
Das ich die Größe durch Änderung von "N" anpassen kann, ist mir schon klar, sage ich z.B. int8_t (N = 8), dann kann ich doch wohl davon ausgehen, dass es sich um einen 8-Bit-Datentypen handeln wird oder etwa nicht?
Konkret zu den fast-Typen:
So richtig verstehe ich noch immer nicht, was hier eventuell geschwindigkeitsrelevant sein soll. Wirklich gute Anwendungsbeispiele zu den fast-Typen finde ich leider nicht, wo man sich das mal anschauen könnte.Zu den least-Typen:
Dies ist ein Typedef auf den kleinsten Datentyp, der mindestens N Bits hat. Auf einer 40-Bit Maschine gibt es vielleicht CHAR_BIT = 10, dann wird char auch 10-bit groß sein. Da gibt es keinen 8-Bit großen Datentyp. Aber eben einen, der mindestens so groß ist. Mit diesen Datentypen sagt man: Die genaue Größe ist mir egal, aber es sollte so klein wie möglich sein und mindestens N-Bit haben.
Wie? Es gibt dann eventuell keinen, aber doch einen, der mind. so groß ist???
Bsp.: int_least8_t, kann ich da jetzt nicht davon ausgehen, einen 8-Bit-Datentyp zu verwenden? Wozu gebe ich die Zahl dann überhaupt an?
Geht es bei diesen Datentypen also um Sparsamkeit im Speicherverbrauch?
So richtig ergeben die least-Typen für mich keinen Sinn. Auch hier wüsste ich gerne ein gutes Anwendungsbeispiel.
_______________Das die normalen Typen, z.B. uint8_t, int8_t, etc. nun einfache typedefs oder notfalls structs sind, ok. ABER, worin unterscheiden sich die Standard-Datentypen (..._t´s, als auch die skalaren, ala int, long, char, etc.) zu den fast- und least-Datentypen? Ich meine, irgendeine Daseinsberechtigung und andere Eigenschaften müssen diese doch haben, sonst könnte man diese genauso gut auch weglassen...
MfG
Schlitzauge
-
-
Schlitzauge schrieb:
In diversen Büchern und im Netz findet man zu solchen Namenskonventionen entsprechende Aussagen.
Dann wirf diese Links weg.
Ok, und wann bzw. auch warum ist dann welche Schreibweise zu bevorzugen?
Mir ist schon bewusst, dass im Falle von typedefs auf ein und denselben Datentyp es egal ist, aber grundlos wird es beide Schreibweisen wohl nicht geben. Mich würden aber schon Eure Empfehlungen dazu interessieren.Die Standardkonforme Schreibweise natuerlich.
int8_t wie es eben in cstdint definiert ist/
So richtig verstehe ich noch immer nicht, was hier eventuell geschwindigkeitsrelevant sein soll. Wirklich gute Anwendungsbeispiele zu den fast-Typen finde ich leider nicht, wo man sich das mal anschauen könnte.
Ein Computer kann unterschiedliche Sachen unterschiedlich schnell. zB ist ein int8_t vielleicht langsamer als ein int32_t. Wenn dir jetzt der Typ selber egal ist, du brauchst aber 8bit und es soll sehr schnell gehen, dann nimmst du ein int_fast8_t und der ist auf dem einen Computer dann 8 bit, auf nem anderen 16 und auf dem neuen Superpositronik Gerhirn dass wir auf unsere Mondsiedlung gepackt haben ein 7,8mio bit gross.
Wie? Es gibt dann eventuell keinen, aber doch einen, der mind. so groß ist???
Mindestens. Das bedeutet: du willst mindestens N bit haben, Also sagst du dem Compiler das. Und er gibt dir mindestens N bit, aber vielleicht auf N*3 bit, weils ihm gerade passt.
Weil vielleicht mag der Compiler keine 8 bit Typen und findet es cooler 10bit typen zu verwenden.
Das die normalen Typen, z.B. uint8_t, int8_t, etc. nun einfache typedefs oder notfalls structs sind, ok.
Nein. Keine structs.
-
Schlitzauge schrieb:
Inwieweit sind diese Datentypen "schneller" und worin unterscheiden sich diese von den anderen Nicht-fast-Datentypen?
Naja, wenn du z.B. einen uint8_t benutzt, kannst du dich darauf verlassen, dass Berechnungen modulo 256 (2**8) stattfinden. Wenn du jetzt aber einfach nur mindestens 8 Bits benötigst und keinen Wert auf die mod-256-Semantik legst, könntest du einen uint_fast8_t verwenden. Damit würde dein Programm auch auf einer C-Implementierung noch laufen, die keinen Datentyp mit genau 8 Bit anbietet. Oder eine Implementierung könnte dir den auf dieser Plattform natürlichen 14-Bit-Integertyp anbieten, anstatt möglicherweise kostspielig Modulo-256-Verhalten zu simulieren.
Der Unterschied zwischen least und fast würde bspw. zutage treten, wenn die C-Implementierung auf dieser 14-Bit-Maschine keinen 8-Bit-Typen anbieten würde, aber noch einen 9-Bit-Typen. Bei leastN_t müsste dieser 9-Bit-Typ verwendet werden, während fastN_t dir auch einfach den Typ entsprechend des nativen 14-Bit-Maschinenworts geben könnte.