struct "zu gross"?



  • Ich habe folgenden struct:

    #pragma pack(push, 1)
    	struct SPDHeader
    	{
    		unsigned short	Handle; //(2Byte)
    		unsigned short	rMax; //(4Byte)
    		unsigned short	cMax; //(6Byte)
    		unsigned short	nPages; //(8Byte)
    		unsigned short	el_Size; //(10Byte)
    		char		Bezeichnung[36]; //(46Byte)
    		char		Mnemo[6]; //(52Byte)
    		char		SigTyp[2]; //(54Byte)
    		double		Skal0; //(62Byte)
    		double		Skal1; //(70Byte)
    		char		Dim[10]; //(80Byte)
    		double		MaxVal; //(88Byte)
    		double		MinVal; //(96Byte)
    		unsigned short	Mask; //(98Byte)
    		char		ParSign[2]; //(100Byte)
    		char		DMODE[3]; //(103Byte)
    		bool		gueltig; //(104Byte)
    		unsigned short	Status; //(106Byte)
    		unsigned short	Anzahl_Plaetze; //(108Byte)
    		unsigned short	Plaetze[32]; //(110Byte)
    		unsigned short	F_Pointer_Adr; //(112Byte)
    		unsigned short	F_Bel_Adr; //(114Byte)
    		char		F_Pointer_mnemo[6]; //(120Byte)
    		char		F_Bel_mnemo[6]; //(126Byte)
    		char		Station[6]; //(132Byte)
    		char		Store[6]; //(138Byte)
    		char		HangUp[6]; //(144Byte)
    		unsigned short	Verarbeitung; //(146Byte)
    		unsigned int	MaxIndex; //(150Byte)
    		unsigned int	Next; //(154Byte)
    		char		Dummy[296]; //(450Byte)
    	};
    

    Mittels

    sizeof(SPDHeader)
    

    erhalte ich eine größe von 512 Byte, was auch so sein soll. Addiere ich aber die Datentypen manuell zusammen, kommt eine größe von nur 450 Byte raus. Was ist mit den restlichen 62 Byte?

    Gruß Vanish





  • Häufig werden die Member nach bestimmten Adressen ausgerichtet, um möglichst effizienten Zugriff zu gewähren (Alignment). Meistens entspricht diese Adressgrösse dem grössten Member. Wenn die Grösse der Struktur nicht als benutzter Platz, sondern als Differenz der letzten und ersten Adresse angesehen wird, kann sie schon grösser sein.

    Man kann die automatische Ausrichtung aber glaube ich ausschalten.



  • Hmm ich dachte durch

    #pragma pack(push, 1)

    wird direkt an den Bytegrenzen ausgerichtet.

    Aber egal, jetzt habe ich die Speicherausrichtung verstanden 🙂
    Danke!

    Gruß Vanish



  • Du hast auch 62 Bytes unterschlagen bei "unsigned short Plaetze[32]"...
    und dann paßt auch die Direktive "#pragma pack(push, 1)" (es stimmt, daß damit auf jedes Byte aligned wird).


Anmelden zum Antworten