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 32

    Ich 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 Bytes

    8+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.


Anmelden zum Antworten