Otimização de Memória em Estruturas C: Técnicas de Empacotamento

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ço
  • short: endereços múltiplos de 2
  • int/float: múltiplos de 4
  • long/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:

  1. Alinhamento pelo maior membro escalar
  2. 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: -Wpadded mostra avisos de alinhamento
  • Pahole: Detecta buracos em estruturas binárias
  • sizeof(): Verifique tamanhos experimentalmente

Tags: C struct memory-alignment padding cache-locality

Publicado em 6-6 22:03 por Thomas