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.