Preenchimento de alinhamento de estrutura, maior tamanho de preenchimento e ordem dos membros da estrutura

Estou aprendendo sobre o preenchimento de dados da estrutura desde que descobri que meu operador sizeof () não estava retornando o que esperava. De acordo com o padrão que observei, alinha os membros da estrutura com o maior tipo de dados. Então, por exemplo ...

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

No entanto, se tornar o último membro um tipo de dados de 8 bytes, por exemplo, por muito tempo, ele ainda adiciona apenas 3 bytes de preenchimento, criando uma estrutura alinhada de quatro bytes. No entanto, se eu criar no modo de 64 bits, ele será alinhado por 8 bytes (o maior tipo de dados). Minha primeira pergunta é: estou errado em dizer que alinha os membros com o maior tipo de dados? Esta declaração parece correta para uma compilação de 64 bits, mas apenas tipos de dados verdadeiros de até 4 bytes em uma compilação de 32 bits. Isso tem a ver com o tamanho nativo da palavra da CPU? Ou o próprio programa?

Minha segunda pergunta é: o seguinte seria um desperdício inteiro de espaço e uma programação ruim?

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

Obrigado.

questionAnswers(3)

yourAnswerToTheQuestion