Struct Alignment



  • Eine Frage zum Struct Alignment.

    Ich verstehe auf dieser Seite Beispiel 3 nicht:
    http://msdn.microsoft.com/en-us/library/71kf49f1.aspx?appId=Dev10IDEF1&l=EN-US&k=k(VC.PROJECT.VCCLCOMPILERTOOL.STRUCTMEMBERALIGNMENT)&rd=true

    Wenn das Alignment 4 ist, dann muss doch "b" bei Offset +4 beginnen, oder? Im Beispiel 2 beginnt "b" ja auch an der Alignmentgrenze (8).



  • Hi

    Das Alignment der gesamten struct sagt nicht direkt etwas über das Alignment der einzelnen Member aus.
    b hat im Beispiel 3 ist ein Alignment von 2 Bytes. Daher muss ein leeres "Füllbyte" (padding) nach char a eingefügt werden. In Beispiel 2 ist b vom Typ double und hat (meist) ein 8 Byte Alignment.

    Das Alignment der gesamt struct beeinflusst in erster Linie das padding hinter dem letzten Member.

    Da short hier (auf x86) nur ein 2-Byte Alignment braucht, macht es ja keinen Sinn ein größeres Padding einzusetzen.
    Es kann aber durchaus Architekturen geben, wo short zwar nur 2 Byte groß ist aber trotzdem ein Alignment von 4 oder 8 Bytes besitzt... dann wäre ein größeres Padding gerechtfertigt.

    So weit mir bekannt ist erhalten structs daher ihr Alignment von dem Member mit dem größten Alignment.

    Du kannst aber auch das Alignment der Member einzeln festlegen:

    struct X
    {
      __declspec(align(8)) char a;
      __declspec(align(8)) short b;
      __declspec(align(8)) int c;
      __declspec(align(8)) double d;
    };
    

    lg, xor


Log in to reply