Unterschied zwischen int32_t und int_fast32_t [duplicate]

Lesezeit: 3 Minuten

Was ist der Unterschied zwischen den beiden? Ich weiß, dass int32_t unabhängig von der Umgebung genau 32 Bit ist, aber wie der Name schon sagt, dass es schnell ist, wie viel schneller kann int_fast32_t wirklich mit int32_t verglichen werden? Und wenn es deutlich schneller geht, warum dann?

  • int_fast32_t ist der am schnellsten verfügbarer vorzeichenbehafteter Integer-Typ mit wenigstens 32 Bit.

    – Marun

    23. April 2013 um 8:04 Uhr


C wird in Form einer idealisierten, abstrakten Maschine spezifiziert. Aber reale Hardware hat Verhaltensmerkmale, die nicht vom Sprachstandard erfasst werden. Das _fast Typen sind Typaliase, die es jeder Plattform ermöglichen, Typen anzugeben, die für die Hardware “bequem” sind.

Wenn Sie beispielsweise ein Array von 8-Bit-Ganzzahlen hätten und jede einzeln mutieren wollten, wäre dies auf modernen Desktop-Rechnern ziemlich ineffizient, da ihre Ladeoperationen normalerweise ein ganzes Prozessorregister füllen möchten, das entweder 32 oder 64 ist Bit breit (ein “Maschinenwort”). Daher werden viele geladene Daten verschwendet, und was noch wichtiger ist, Sie können das Laden und Speichern von zwei benachbarten Array-Elementen nicht parallelisieren, da sie sich im selben Maschinenwort befinden und daher nacheinander geladen, geändert und gespeichert werden müssen.

Das _fast Typen sind normalerweise so breit wie ein Maschinenwort, wenn dies möglich ist. Das heißt, sie können sein breiter als Sie benötigen und verbrauchen daher mehr Speicher (und sind daher schwieriger zu cachen!), aber Ihre Hardware kann möglicherweise schneller darauf zugreifen. Es hängt jedoch alles vom Nutzungsverhalten ab. (zB ein Array von int_fast8_t wäre wahrscheinlich ein Array von Maschinenwörtern, und eine enge Schleife, die ein solches Array modifiziert, könnte durchaus erheblich davon profitieren.)

Ob es einen Unterschied macht, lässt sich nur durch Vergleichen herausfinden!

Benutzer-Avatar
Offi

int32_t ist eine ganze Zahl, die genau 32 Bit lang ist. Es ist nützlich, wenn Sie beispielsweise eine Struktur mit einer genauen Speicherplatzierung erstellen möchten.

int_fast32_t ist die “schnellste” Ganzzahl für Ihren aktuellen Prozessor, die endlich größer oder gleich ein ist int32_t. Ich weiß nicht, ob es wirklich einen Gewinn für aktuelle Prozessoren (x86 oder ARM) gibt

Aber ich kann endlich einen realen Fall skizzieren: Ich habe früher mit einem 32-Bit-PowerPC-Prozessor gearbeitet. Beim Zugriff auf falsch ausgerichtete 16-Bits int16_t, war es ineffizient, da es sie zuerst in einem seiner 32-Bit-Register neu ausrichten musste. Für nicht speicherabgebildete Daten war die Verwendung effizienter, da wir keine Speicherbeschränkungen hatten int_fast16_t (die tatsächlich 32 Bit int waren).

  • Ich denke nicht, dass eine Antwort, die den einen interessanten Punkt in Dr. Evil-Zitate bringt, sehr nützlich ist … was bedeutet “am schnellsten” bedeuten?

    – Kerrek SB

    23. April 2013 um 8:14 Uhr

  • @KerrekSB: Der Standard sagt nur “am schnellsten”, mit einer Fußnote “Der angegebene Typ ist nicht garantiert für alle Zwecke am schnellsten; wenn die Implementierung keine klaren Gründe dafür hat, einen Typ einem anderen vorzuziehen, wird einfach ein zufriedenstellender ganzzahliger Typ ausgewählt die Vorzeichen- und Breitenanforderungen.” Daher finde ich die Anführungszeichen durchaus angemessen, da jeder Implementierer frei entscheiden kann, wie er „Geschwindigkeit“ misst. int_fast32_t könnte bei einer 64-Bit-Implementierung leicht 32 Bit sein.

    – Steve Jessop

    23. April 2013 um 8:54 Uhr


  • Entschuldigung, ein Meeting hat das Schreiben meiner Antwort unterbrochen. Es ist nun komplett mit einem – hoffentlich – aufschlussreichen Beispiel.

    – Firmmo

    23. April 2013 um 9:06 Uhr

1176810cookie-checkUnterschied zwischen int32_t und int_fast32_t [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy