Kann ich mich darauf verlassen, sizeof(uint32_t) == 4?
Ich weiß das ich mich verlassen kann sizeof(char) == 1
, aber was sizeof(uint32_t)
und sizeof(uint8_t)
?
Sollte es nicht 32bit (8bit) in der Größe erraten, aus dem Namen?
Danke!
- Es wäre sehr inkonsequent, wenn
sizeof()
zurückkehren würde, bits anstelle von bytes, die nur in diesen Fällen. - Natürlich, solange
CHAR_BIT == 8
können Sie. Heutzutage ist es nicht leicht zu finden, eine Architektur, wo das nicht so ist. sizeof()
gibt die Anzahl der bytes,uint32_t
gibt die Breite in bits, so dass im Grunde, was sind die Anzahl der bits in einem byte auf die Ziel Plattform? SehenCHAR_BIT
.- Ich habe gehört, dass es eine Menge von embedded-Prozessoren, wo
CHAR_BIT == 32
. (Ich habe nicht gearbeitet, die auf embedded-Prozessoren für die letzten 30 Jahre, also weiß ich nicht aus Erfahrung. Aber einer der letzten, die ich gearbeitet habe nicht byte-Adressierung, und die übliche Umsetzung hätteCHAR_BIT == 16
.) - Ich nehme an, dass ist wahr-aber das ist ein ziemlich getrennt Nische in der Programmierung. Die meisten Entwickler sind den Umgang mit mainstream-Architekturen, die es scheint endlich geklärt
CHAR_BIT == 8
. - Es ist eindeutig eine bestimmte Domäne. Ich vermute, dass es sich um eine größere Anzahl von Programmierern, als Sie denken, aber es gibt eine Menge mehr embedded-Prozessoren als Desktop-PCs oder Großrechnern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fixed-sized-Typen werden immer exakt die gleiche Größe. Wenn Sie auf einige seltsame Plattform, die nicht integer-Typen in der Größe dann werden Sie nicht definiert.
Beachten Sie, dass es nicht zwangsläufig Folgen, dass
sizeof(uint32_t) == 4
, wennCHAR_BIT != 8
; aber auch dies tritt nur auf seltsamen Plattformen.Absolut nicht, zumindest mit Bezug auf
sizeof(uint32_t)
.sizeof
gibt die Anzahl der bytes an, nicht die Anzahl der bits,und wenn ein byte von 16 bit auf der Plattform
sizeof(uint32_t)
2, nicht 4; wenn ein byte 32 bit (und solche Plattformen
tatsächlich existiert)
sizeof(uint32_t)
1 (unduint32_t
könnte ein typedef zu
unsigned char
).Natürlich in solchen Fällen
uint8_t
nicht definiert werden.char
byte per definition.sizeof
gibt immer die Anzahl der bytes.CHAR_BIT
ist die Anzahl der bits in einem byte.CHAR_BIT == 32
(und wohl auch einige mitCHAR_BIT == 16
). Und es ist nicht allzu lange her, dass es ein system mitCHAR_BIT == 9
produziert (aber natürlich, dass man nicht hätteuint32_t
definiert werden, da es noch keine 32-bit-Typen auf es).NEIN, es ist völlig abhängig von Ihrem compiler und Architektur(dh es wird zu unterschiedlichen Ergebnissen führen, wo Sie nicht haben, integer-Typen). Wenn Sie
CHAR_BIT == 8
dann, ja, darauf können Sie sich verlassen. Also, wenn Sie auf 64-bit-Architektur angepasst werden, um 64-bit-Grenzen, die gleichen wie bei der 32-bit-Architektur alles ist ausgerichtet auf die 4 bytes.Also, Wenn die Größe der Daten nicht kritisch ist (z.B. ein Satz von bit-flags) verwenden Sie immer fester Größe, Arten.
malloc(sizeof(unit32_t) * x)
Anfragen "doppelten Speicherplatz" auf einem 64 vs 32 Bogen?