ushort spinnt im struct



  • Folgendes Problem:

    typedef unsigned char uchar;
    typedef unsigned int uint;
    typedef unsigned short ushort;
    //...
    typedef struct Data1{
    	uchar val1[3];
    	uchar val2[8];
    	ushort val3; // ushort scheint sich 3 Bytes zu nehmen oder ein Byte auszulassen???
    	//uchar val3[2]; // so funktionierts wies soll
    
    	// ...
    
    } Data1;
    
    // buffer buf ist ein uchar* und wird von nem File eingelesen ...
    Data1 *p = (Data1*) buf; // cast in den struct
    // Tests...
    

    Lese einen Datensrom aus einer Datei und presse ihn in das struct. Habe die Felder des structs in Tests ausgelsen und alles funktioniert wunderbar, bis auf eines: Ab dem val3 scheint der Datenstrom um ein Byte zuweit nach hinten gerückt, so als ob vor dem val3 ein Byte ins Nirwana gelesen würde. Wenn ich dann anstatt dem ushort einen uchar[2] nehme geht alles wieder wunderbar. Habe mir auch schon sizeof(ushort) angeschaut und es kommt wie erwartet 2 raus. Aber bei dem struct scheint irgendwas durcheinander zu kommen sobald ich den ushort nehme. 😮

    WTF? Was ist hier los?



  • Das nennt sich "padding". Der Compiler fuegt ein paar Dummy-Bytes in die struct ein, damit die Variablen sich an (z.B.) durch 4 teilbaren Adressen befinden. Auf manchen CPUs laufen Programme ueberhaupt nicht ohne padding, auf x86 laufen sie nur langsamer.

    Padding kannst du durch compiler-spezifische Befehle verhindern.



  • Wow, danke. Da wäre ich so schnell nicht drauf gekommen.

    Hab das Alignment im VC++ jetzt mit #pragma pack(1) abgeschalten.



  • Nochmal ne Frage zum Alignment:

    Auf 32 bit x86ern werden also i.d.R. 4 Byte am Stück aus dem RAM geholt. Sind das auf 64 bit Maschinen dann 8 Byte am Stück?


Anmelden zum Antworten