Quando programando aplicações de alta performance como jogos eletrônicos, desenvolvedores procuram truques para escrever código rápido que maximize os recursos limitados. A alocação de memória é crítica para código crítico de desempenho que requer memória variável. Um "bump allocator" ou alocador de pilha otimiza isso tratando a alocação como uma simples adição de inteiros e a desalocação como uma atribuição de inteiros ainda mais barata.
Por volta de 2010, enquanto trabalhava na Surreal Software no projeto cancelado "This is Vegas," a programação de animação enfrentou alocações transitórias frequentes para mistura de animações. Essas alocações existiram apenas brevemente por quadro e dependiam de quais personagens estavam ativos, determinados pela frustum da câmera. O alocador apareceu como um ponto quente no perfilamento.
A solução envolveu implementar um alocador de pilha onde a alocação é meramente uma adição de inteiros, e liberar memória é uma única atribuição de inteiros. Ao alocar um bloco fixo (por exemplo, 1MB) e manter uma variável "tos" (top of stack), o gerenciamento de memória tornou-se quase instantâneo. O resultado foi uma melhoria significativa no desempenho, com tempos de alocação mensuráveis nos perfis.
Uma limitação-chave é que este alocador não chama automaticamente os destrutores; enquanto o placement new pode lidar com construtores, o gerenciamento de destrutores é manual e propenso a erros. Além disso, alocadores de pilha brilham em ambientes multithreadados se a variável "tos" usar adição atômica, permitindo que vários threads alocuem do mesmo pool, benéfico em situações de CPU fork/join ou algoritmos GPU. Desalocações parciais também são possíveis, lembrando o estado "tos" no início de processos recursivos e redefinindo-o ao final.
A técnica oferece ganhos de velocidade substanciais para necessidades de memória transitória durante um quadro de jogo.
Fonte: Hacker News · Resumido por HeadlinesBriefing