Frage zu sizeof
-
typedef struct opening_book { unsigned __int64 hashkey; unsigned __int32 total_games; __int32 score; __int32 learning; __int32 res; }BOOK_T; typedef struct opening_book_header { unsigned __int64 hashkey; unsigned __int32 version; unsigned __int64 date; __int32 res; }BOOK_HEADER_T;
Warum erhalte ich zu diesen beiden Stukturen unterschiedliche sizeof ?
sizeof(BOOK_T) ergibt 24
sizeof(BOOK_HEADER_T) ergibt 32Ich hätte für beide 24 erwartet. Den Wert für sizeof(BOOK_HEADER_T) kann ich mir nicht erklären.
unsigned __int64 = 8 Bytes
unsigned __int32 = 4 Bytes
__int32 = 4 Bytes8+4+8+4 = 24
Warum also liefert sizeof(BOOK_HEADER_T) 32.
Wer kann mir weiterhelfen ?
-
Dürfte am padding liegen. Der Compiler fügt zusätzlich (leere) Bytes in deinem Struct ein, damit er schneller auf die einzelnen Elemente zugreifen kann.
Siehe z.b. hier
-
Also umsortieren hilft:
typedef struct opening_book_header { unsigned __int64 hashkey; unsigned __int64 date; unsigned __int32 version; __int32 res; }BOOK_HEADER_T;
sizeof(BOOK_HEADER_T) -> 24
Danke für die rasche Antwort
-
vergie01 schrieb:
Also umsortieren hilft:
typedef struct opening_book_header { unsigned __int64 hashkey; unsigned __int64 date; unsigned __int32 version; __int32 res; }BOOK_HEADER_T;
sizeof(BOOK_HEADER_T) -> 24
Danke für die rasche Antwort
ja, hab mal sowas gelesen, das die members immer in absteigender größe sortiert werden sollen, schützt aber nicht immer vor paddings (evtl. speziell bei bitfields) oder?
lg lolo
-
Das Alignment kannst du deinem Compiler aber auch mitteilen.
Mit dem VC-Compiler lautet der Befehl #pragma pack(n), wobei n für das Alignment steht. Mit dem GCC steht __attribute__ (aligned (n)) zur Verfügung.
Es ist für die CPU immer am besten, wenn die Speicherstellen an der Wortbreite des Prozessors ausgerichtet sind. Es handelt sich daher um eine Optimierung des Compilers die sich als solche aber auch meist umgehen lässt.
Andernfalls richtet sich das Alignment nach der Größe des größten Types innerhalb deiner Struct.