Deslocamento em uma estrutura com campos de bits
Se tivermos uma estrutura com campos de bits, como os membros subsequentes são alinhados na estrutura? Considere o seguinte código:
struct A{
int a:1;
char b; // at offset 1
};
struct B{
int a:16;
int b: 17;
char c; // at offset 7
};
printf("Size of A: %d\n", (int)sizeof(struct A));
printf("Offset of b in A: %d\n", (int)offsetof(struct A, b));
printf("Size of B: %d\n", (int)sizeof(struct B));
printf("Offset of c in B: %d\n", (int)offsetof(struct B, c));
Saída:
Size of A: 4
Offset of b in A: 1
Size of B: 8
Offset of c in B: 7
Aqui, no primeiro caso,b
é alocado apenas no segundo byte da estrutura sem qualquer preenchimento. Mas, no segundo caso, quando os campos de bit estouram 4 bytes,c
é alocado no último (8º) byte.
O que está acontecendo no segundo caso? Qual é a regra para preenchimento em estruturas envolvendo campos de bits em geral?