Größe einer Struktur
-
Hallo,
wenn ich die Größe einer Struktur z.B.typedef struct Tmod0_param { unsigned short a; unsigned char b; unsigned char c; unsigned char d; } Tmod0_param;mit
sizeof(Tmod0_param);auslese kommt 6 oder 7 raus und nicht 5. Wieso ist das so und vor allem was kann ich dagegen tun?
Danke für jeden Tip
Gruß Dscho
-
Das liegt am Byte Padding, der Compiler ordnet die Daten an geraden Bytegrenzen an.
Siehe auch http://www.eventhelix.com/RealtimeMantra/ByteAlignmentAndOrdering.htm
-
short = 1 byte
char = 2 byteshort + char + char + char = 7
(no garanty #gg)
-
sizeof(char) = 1 !!
ISO/IEC 9899:1999(E)
6.5.3.4 The sizeof operator
3 When applied to an operand that has type char, unsigned char,
or signed char, (or a qualified version thereof) the result
is 1. When applied to an operand that has array type, the result
is the total number of bytes in the array. When applied to an
operand that has structure or union type, the result is the total
number of bytes in such an object, including internal and trailing
padding.
-
Mr Evil schrieb:
short = 1 byte
char = 2 byteshort + char + char + char = 7
(no garanty #gg)
Nette Ansicht. Eigentlich is das etwas anders. Wie bereits gesagt ist sizeof( char ) immer gleich 1. sizeof( short ) kann variieren, ich nehme aber fast an dass das in dem Fall 2 entspricht.
D.h. 2 + 1 + 1 + 1 = 5, sizeof( Tmod0_param ) ist aber 6, was auf die sog. Paddingbytes zurückzuführen ist die vom Compiler hinzugefügt werden (-> gibts genug Artikel in Google die das Thema behandeln). Im Grund dreht es sich um eine möglichst optimale Verteilung der Objekte im Speicher und optimalen Zugriffsmöglichkeiten.Visual Studio bietet die Möglichkeit das Erzeugen von Paddingsbytes über pramga Direktiven zu unterbinden:
#pragma pack( push, 1 ) typedef struct Tmod0_param { unsigned short a; unsigned char b; unsigned char c; unsigned char d; } Tmod0_param; #pragma pop
-
Vielen Dank für die vielen und schnellen Antworten
Gruß Dscho