Заполнение выравнивания структуры, наибольший размер заполнения и порядок элементов структуры

Я узнал о заполнении структурных данных с тех пор, как узнал, что мой оператор sizeof () не возвращает того, что я ожидал. Согласно шаблону, который я наблюдал, он выравнивает элементы структуры по наибольшему типу данных. Так например ...

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
};

Однако, если сделать последний элемент 8-байтовым типом данных, например long long, он все равно добавляет только 3 байта заполнения, создавая выровненную четырехбайтовую структуру. Однако, если я собираю в 64-битном режиме, он на самом деле выравнивается на 8 байтов (самый большой тип данных). Мой первый вопрос: я не прав, говоря, что это выравнивает элементы с наибольшим типом данных? Это утверждение кажется верным для 64-битной сборки, но в 32-битной сборке имеет значение только до 4-байтовых типов данных. Имеет ли это отношение к собственному «размеру слова» процессора? Или сама программа?

Мой второй вопрос: будет ли следующая трата пространства и плохое программирование?

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)
};

Благодарю.

Ответы на вопрос(3)

Ваш ответ на вопрос