Auffüllung der Strukturausrichtung, größte Auffüllgröße und Reihenfolge der Strukturelemente

Ich habe etwas über das Auffüllen von Strukturdaten gelernt, da ich herausgefunden habe, dass mein sizeof () -Operator nicht das zurückgibt, was ich erwartet hatte. Entsprechend dem von mir beobachteten Muster werden Strukturelemente mit dem größten Datentyp ausgerichtet. Also zum Beispiel ...

struct MyStruct1
{
    char a;     // 1 byte
    char b;     // 1 byte
    char c;     // 1 byte
    char d;     // 1 byte
    char e;     // 1 byte
                // Total 5 Bytes

    //Total size of struct = 5 (no padding)
};

struct MyStruct2
{
    char a;     // 1 byte
    char b;     // 1 byte
    char c;     // 1 byte
    char d;     // 1 byte
    char e;     // 1 byte
    short f;    // 2 bytes
                // Total 7 Bytes

    //Total size of struct = 8 (1 byte of padding between char e and short f
};

struct MyStruct3
{
    char a;         // 1 byte
    char b;         // 1 byte
    char c;         // 1 byte
    char d;         // 1 byte
    char e;         // 1 byte
    int f;          // 4 bytes
                    // Total 9 bytes

    //Total size of struct = 12 (3 bytes of padding between char e and int f
};

Wenn Sie jedoch das letzte Element zu einem 8-Byte-Datentyp machen, z. B. zu einem Long Long, werden immer noch nur 3 Byte Padding hinzugefügt, wodurch eine vier Byte lange, ausgerichtete Struktur entsteht. Wenn ich jedoch im 64-Bit-Modus arbeite, wird tatsächlich eine Ausrichtung für 8 Bytes (der größte Datentyp) durchgeführt. Meine erste Frage ist, bin ich falsch zu sagen, dass es die Mitglieder mit dem größten Datentyp ausrichtet? Diese Anweisung scheint für einen 64-Bit-Build korrekt zu sein, stimmt jedoch nur für bis zu 4-Byte-Datentypen in einem 32-Bit-Build. Hat dies mit der nativen Wortgröße der CPU zu tun? Oder das Programm selbst?

Meine zweite Frage lautet: Wäre das Folgende eine völlige Verschwendung von Platz und schlechter Programmierung?

struct MyBadStruct
{
    char a;             // 1 byte
    unsigned int b;     // 4 bytes
    UINT8 c;            // 1 byte
    long d;             // 4 bytes
    UCHAR e;            // 1 byte
    char* f;            // 4 bytes 
    char g;             // 1 byte
                        // Total of 16 bytes

    //Total size of struct = 28 bytes (12 bytes of padding, wasted)
};

Vielen Dank

Antworten auf die Frage(6)

Ihre Antwort auf die Frage