Então você quer suporte a alocador personalizado na sua biblioteca C

Alocadores de memória personalizados para bibliotecas C prometem melhor desempenho, flexibilidade e integração com ferramentas, mas seu design levanta questões delicadas de segurança e praticidade. Comentadores debatem APIs que exigem que os chamadores passem tamanhos de objetos, alinhamento e ponteiros de contexto — argumentando que isso pode acelerar a alocação e ajudar na depuração — enquanto outros observam que o C do mundo real muitas vezes não acompanha esses detalhes de forma confiável e pode se tornar mais frágil. O debate também contrasta designs minimalistas de “função única de alocação” com interfaces mais claras, porém mais verbosas, e destaca como essas escolhas afetam a escalabilidade multithread, a integração com ferramentas como ASAN/valgrind e o suporte a padrões como arenas e stack allocators.

Segurança e correção das APIs de alocação

  • Vários comentaristas argumentam que exigir o tamanho em free/realloc poderia ter evitado muitos bugs, mas outros dizem que confiar em tamanhos fornecidos pelo chamador é perigoso e ainda precisa ser verificado.
  • Alguns observam que muitos alocadores já conhecem os tamanhos por meio de metadados ou arenas, então argumentos extras de tamanho muitas vezes só duplicam o trabalho, a menos que sejam tratados como dicas.
  • Há resistência à afirmação do artigo de que os chamadores “sempre” têm o tamanho original; as pessoas apontam contraexemplos realistas em que isso não acontece.

Passando informações de tamanho e alinhamento

  • Quem apoia passar o tamanho para free diz que isso pode evitar buscas custosas em arenas/buckets e acesso a metadados.
  • Outros observam que alocadores modernos geralmente conseguem recuperar o tamanho de forma barata, sem percorrer estruturas.
  • Vários comentários argumentam que o alinhamento estendido deveria fazer parte da interface; alguns querem um parâmetro explícito de alinhamento por chamada, outros dependem de contexto ou de APIs separadas de aligned-alloc.
  • Há debate sobre se o alinhamento é obrigatório (para um free correto) ou pode ser “apenas uma dica”.

Interfaces de alocador de função única vs múltiplas funções

  • Um grupo gosta de uma API de estilo único allocate(ptr, size, ...) que codifica malloc/realloc/free por combinações de argumentos, citando simplicidade e pegadas pequenas (por exemplo, designs ao estilo Lua).
  • Os críticos dizem que combinar operações complica o raciocínio, introduz casos ambíguos (alloc(NULL, 0)), e torna revisão e ferramentas mais difíceis; eles preferem alloc/free/realloc separados.

Alocação gerenciada pelo chamador vs pela biblioteca

  • Alguns defendem APIs em que o chamador aloca, possivelmente via padrões em duas passagens (calcular tamanho depois escrever), operações retomáveis, ou “passar um callback de alocador” como no artigo.
  • Outros respondem que isso só funciona para casos simples (por exemplo, algo como snprintf), enquanto bibliotecas complexas (DOMs XML etc.) inevitavelmente alocam internamente e se beneficiam de alocadores plugáveis.

Threading e desempenho

  • A discussão observa que alocadores com estado global escalam mal; caches locais por thread, mais mecanismos para frees entre threads (filas, CAS, locks por classe de tamanho), são mitigações comuns.
  • Há interesse em quão simplesmente esses esquemas podem ser implementados mantendo boa escala multicore.

Restrições reais do C e alocações de tamanho zero

  • Vários comentários destacam que muitas bases de código C existentes não rastreiam tamanhos rigorosamente, especialmente com strings terminadas em nulo e arrays flexíveis.
  • Há debate sobre o significado e a utilidade de malloc(0) e sobre sinalização em banda com valores numéricos especiais como 0 ou -1.

Ferramentas e integração

  • Alguns enfatizam que as APIs de alocador deveriam integrar-se com ferramentas como ASan e Valgrind; anotações são consideradas diretas, mas essenciais.