int
kann 16, 32 oder sogar 64 Bit auf aktuellen Computern und Compilern sein. In Zukunft könnte es größer sein (zB 128 Bit).
Wenn Ihr Code in Ordnung ist, gehen Sie mit ihm.
Wenn Ihr Code nur mit 32-Bit-Ints getestet und verwendet wird, sollten Sie die Verwendung von int32_t
in Erwägung ziehen. Dann wird der Code zur Kompilierungszeit statt zur Laufzeit fehlschlagen, wenn er auf einem System ausgeführt wird, das keine 32-Bit-Ints hat (was heutzutage extrem selten ist).
int_fast32_t
ist, wenn Sie mindestens 32 Bits benötigen, aber Sie interessieren sich sehr für die Leistung. Auf Hardware, bei der eine 32-Bit-Ganzzahl als eine 64-Bit-Ganzzahl geladen wird, dann in einem beschwerlichen Prozess auf eine 32-Bit-Ganzzahl zurückgeschoben wird, kann die int_fast_32_t
eine 64-Bit-Ganzzahl sein. Die Kosten dafür sind, dass sich der Code auf obskuren Plattformen sehr unterschiedlich verhält.
Wenn Sie nicht auf solchen Plattformen testen, würde ich davon abraten.
Es ist in der Regel besser, Dinge zum Zeitpunkt der Erstellung zu unterbrechen, als wenn sie zur Laufzeit unterbrochen werden. Wenn und wenn Ihr Code tatsächlich auf einem obskuren Prozessor ausgeführt wird, der diese Funktionen benötigt, beheben Sie ihn mit . Es gilt die Regel "Sie werden es wahrscheinlich nicht brauchen".
Seien Sie vorsichtig, generieren Sie frühe Fehler auf der Hardware, auf der Sie nicht getestet werden, und wenn Sie diese Hardware portieren müssen, sind die erforderlichen Arbeiten und Tests erforderlich.
Kurz:
Verwenden int_fast##_t
, wenn und nur wenn Sie getestet Code (und wird auch weiterhin testen) auf Plattformen, auf denen die int Größe variiert, und Sie haben gezeigt, dass die Leistungsverbesserung wert ist diese zukünftige Wartung.
Die Verwendung von int##_t
mit gemeinsamen ##
Größen bedeutet, dass Ihr Code nicht auf Plattformen kompiliert werden kann, auf denen Sie ihn nicht getestet haben. Das ist gut; Ungeprüfter Code ist nicht zuverlässig und unzuverlässiger Code ist normalerweise schlechter als nutzlos.
Ohne int32_t
und unter Verwendung int
, Ihr Code wird manchmal int
s, die 32 sind und manchmal Ints, der 64 (und in der Theorie mehr) sind, und manchmal int
s, die 16 sind, wenn Sie bereit sind, zu testen und Unterstützen Sie jeden solchen Fall in jedem solchen int
, gehen Sie dafür.
Beachten Sie, dass Arrays von int_fast##_t
Cache-Probleme haben können: Sie könnten unverhältnismäßig groß sein. Als ein Beispiel könnte int_fast16_t
64 Bits sein. Ein Array von ein paar tausend oder Millionen von ihnen könnte individuell schnell arbeiten, aber die Cache-Misses, verursacht durch ihre Masse, könnten sie insgesamt langsamer machen; und das Risiko, dass Dinge auf langsameren Speicher ausgelagert werden, wächst.
int_least##_t
kann in diesen Fällen schneller sein.
Dasselbe gilt doppelt für netzwerkübertragene und Datei-gespeicherte Daten, zusätzlich zu dem offensichtlichen Problem, dass Netzwerk-/Dateidaten normalerweise Formaten folgen müssen, die stabil gegenüber Compiler/Hardware-Änderungen sind. Dies ist jedoch eine andere Frage.
Bei der Verwendung von Integer-Typen mit fester Breite muss jedoch besonders darauf geachtet werden, dass int, long usw. immer noch dieselbe Breite wie zuvor haben. Integer-Heraufstufung erfolgt immer noch basierend auf der Größe von int, die von dem verwendeten Compiler abhängt. Eine Ganzzahl in Ihrem Code hat den Typ int und die zugehörige Breite. Dies kann zu unerwünschtem Verhalten führen, wenn Sie Ihren Code mit einem anderen Compiler kompilieren. Für ausführlichere Informationen: https://stackoverflow.com/a/13424208/3144964
Ihr "Nachteil" scheint auf einer Annahme zu beruhen. Wer sagt, dass 'std :: int16_t' und' std :: int32_t' verschwinden könnten? Schließlich werden sie vom * Standard * benötigt. –
Wenn Sie sicher sein wollen, dass Ihr Int mindestens 32 Bit breit ist, tun Sie es. Normal 'int' gibt keine solche Garantie. –
@GregHewgill sie sind optional. Ich meine, dass sie in zukünftigen Versionen eines OS & Compilers möglicherweise nicht unterstützt werden, wenn sie dort zuvor unterstützt wurden. Mir ist kein OS & Compiler bekannt, der nicht std :: int16_t und std :: int32_t liefert, aber da sie nur optional sind, wenn eine ganze Zahl dieser Größe bereits nativ existiert, kann ihre Existenz nicht garantiert werden. Siehe auch: http: // stackoverflow.com/questions/32155759/state-of-support-für-die-optional-fixed-width-integer-types-eingeführt-in-c11, wo Sie antworten können, wenn Sie mehr wissen :) – Ident