Fundamentos de Alinhamento
Processadores modernos impõem restrições ao armazenamento de tipos de dados básicos em C. Tipos como int e ponteiros exigem endereços específicos:
char: qualquer endereçoshort: endereços múltiplos de 2int/float: múltiplos de 4long/double: múltiplos de 8
Essa autodinhamento (self-alignment) acelera o acesso via instruções únicas. Violações podem causar falhas ou lentidão em certas arquiteturas.
Mecanismo de Preenchimento
Declarações não otimizadas geram lacunas de memória:
long *ptr; // 8 bytes
char id; // 1 byte
// Preenchimento implícito: 7 bytes
double valor; // 8 bytes
O compilador insere char pad[7] para alinhar valor. Reordenanod os membros:
long *ptr; // 8 bytes
double valor; // 8 bytes
char id; // 1 byte
// Preenchimento final: 7 bytes
Regras para Estruturas
Estruturas seguem duas regras fundamentais:
- Alinhamento pelo maior membro escalar
- Preenchimento final até o próximo endereço múltiplo
struct Exemplo {
char *p; // 8 bytes
short s; // 2 bytes
char c; // 1 byte
// Preenchimento: 5 bytes (total 16)
};
Campos de Bits
Bitfields podem compactar dados, mas geram preenchimento adicional:
struct Flags {
short codigo;
char estado;
unsigned ativo : 1;
unsigned tipo : 4;
// Preenchimento interno: 11 bits
// Preenchimento final: 1 byte
};
Reordenamento Estratégico
Organizar membros por tamanho decrecsente minimiza lacunas:
// Original (24 bytes)
struct Pessoa {
char nome;
struct Pessoa *prox;
int idade;
};
// Otimizado (16 bytes)
struct PessoaOtimizada {
struct PessoaOtimizada *prox;
int idade;
char nome;
};
Essa técnica reduziu 33% do consumo em listas encadeadas.
Considerações de Desempenho
Além da compactação, considere:
- Localidade de cache: Agrupar dados acessados sequencialmente
- Lieturabilidade: Manter membros semanticamente relacionados juntos
- Concorrência: Evitar bouncing de linhas de cache em threads
Técnicas Avançadas
Métodos complementares para redução de memória:
- Bitfields em lacunas existentes
- Redução de tipos (ex: timestamps de 32 bits)
- Uniões para membros mutuamente exclusivos
Ferramentas de Diagnóstico
Utilize recursos para análise:
- Clang:
-Wpaddedmostra avisos de alinhamento - Pahole: Detecta buracos em estruturas binárias
sizeof(): Verifique tamanhos experimentalmente