💻 Exemplos de Código: Cap 16 - Structs, Padding, Unions e Enums
Código executável completo demonstrando comparação de tamanho de structs com padding, decodificação de bytes com union e empacotamento com Bit-Fields.
📄 Exemplo 1: Struct Padding e Alinhamento de Memória (padding_demo.c)
#include <stdio.h>
#include <stddef.h>
// Estrutura mal otimizada
struct Desordenada {
char flag1; // 1B + 7B padding
double valor; // 8B
char flag2; // 1B + 7B padding
};
// Estrutura reorganizada por tamanho decrescente
struct Otimizada {
double valor; // 8B
char flag1; // 1B
char flag2; // 1B + 6B padding final
};
int main(void) {
printf("====================================================\n");
printf(" 📐 AUDITORIA DE STRUCT PADDING E ALINHAMENTO DA CPU\n");
printf("====================================================\n");
printf("struct Desordenada:\n");
printf(" Tamanho Total (sizeof): %zu bytes\n", sizeof(struct Desordenada));
printf(" Offset de flag1: +%zu bytes\n", offsetof(struct Desordenada, flag1));
printf(" Offset de valor: +%zu bytes\n", offsetof(struct Desordenada, valor));
printf(" Offset de flag2: +%zu bytes\n", offsetof(struct Desordenada, flag2));
printf("----------------------------------------------------\n");
printf("struct Otimizada:\n");
printf(" Tamanho Total (sizeof): %zu bytes (Economia de %zu bytes!)\n",
sizeof(struct Otimizada),
sizeof(struct Desordenada) - sizeof(struct Otimizada));
printf(" Offset de valor: +%zu bytes\n", offsetof(struct Otimizada, valor));
printf(" Offset de flag1: +%zu bytes\n", offsetof(struct Otimizada, flag1));
printf(" Offset de flag2: +%zu bytes\n", offsetof(struct Otimizada, flag2));
printf("====================================================\n");
return 0;
}
📄 Exemplo 2: União e Campos de Bits para Hardware (hardware_union.c)
#include <stdio.h>
#include <stdint.h>
// União com Bit-Fields para inspecionar um registrador de hardware de 16 bits
typedef union {
uint16_t registradorCompleto;
struct {
unsigned int habilitado : 1; // Bit 0
unsigned int modoOperacao : 3; // Bits 1 a 3 (Modos 0 a 7)
unsigned int nivelPrioridade: 4; // Bits 4 a 7 (0 a 15)
unsigned int codigoStatus : 8; // Bits 8 a 15 (0 a 255)
} campos;
} RegistradorDispositivo;
int main(void) {
RegistradorDispositivo dev;
dev.registradorCompleto = 0xA519; // 0b10100101 00011001
printf("====================================================\n");
printf(" ⚡ REGISTRADOR DE HARDWARE COM UNION & BIT-FIELDS\n");
printf("====================================================\n");
printf(" Valor Bruto Hexadecimal: 0x%04X\n", dev.registradorCompleto);
printf("----------------------------------------------------\n");
printf(" Bit Habilitado: %u\n", dev.campos.habilitado);
printf(" Modo de Operacao (3b): %u\n", dev.campos.modoOperacao);
printf(" Nivel Prioridade (4b): %u\n", dev.campos.nivelPrioridade);
printf(" Codigo de Status (8b): 0x%02X\n", dev.campos.codigoStatus);
printf("====================================================\n");
return 0;
}