biblioteca alocador hierárquico Memória para C ++
-
08-07-2019 - |
Pergunta
A minha aplicação é principalmente organizado em camadas , então eu descobri que algo como o pools de memória APR seria o melhor caminho.
Ao ler sobre SO sobre mensagens C++ placement new
aqui & aqui , e uma questão de alocação C mais genérico Eu estava pensando sobre a mão-elaboração de uma piscina alocador hierárquica como sugerido em um post, mas na pura tradição da JNI estou primeira perguntando se algo como isso já existe.
Ele também poderia ter a boa propriedade de ser capaz de dar a memória de volta não utilizado para o sistema operacional (desde alocação poderia ser feito com mmap(MAP_ANON)
) ou poderia ser alocação do pilha como sugerido Ferrucico < a href = "https://stackoverflow.com/questions/362953/what-are-uses-of-the-c-construct-placement-new/363537#363537"> aqui .
Solução
Eu sei de outro bom alocador de memória hierárquica, mas chama malloc
debaixo das cobertas.
talloc é um alocador de memória baseada piscina hierárquica com destruidores. É o alocador de memória de núcleo usado em Samba4, e fez uma enorme diferença em muitos aspectos do desenvolvimento Samba4.
Para começar com talloc, eu recomendo que você leia a talloc guia .
Dito isto, malloc
do Glibc já utiliza mmap(MAP_ANON)
para alocação maior do que mmap_threshold
, que pode ser definida via mallopt(M_MMAP_THRESHOLD, bytes)
. Por padrão, ele é ajustado dinamicamente entre
/*
MMAP_THRESHOLD_MAX and _MIN are the bounds on the dynamically
adjusted MMAP_THRESHOLD.
*/
#ifndef DEFAULT_MMAP_THRESHOLD_MIN
#define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024)
#endif
#ifndef DEFAULT_MMAP_THRESHOLD_MAX
/* For 32-bit platforms we cannot increase the maximum mmap
threshold much because it is also the minimum value for the
maximum heap size and its alignment. Going above 512k (i.e., 1M
for new heaps) wastes too much address space. */
# if __WORDSIZE == 32
# define DEFAULT_MMAP_THRESHOLD_MAX (512 * 1024)
# else
# define DEFAULT_MMAP_THRESHOLD_MAX (4 * 1024 * 1024 * sizeof(long))
# endif
#endif
Watch para fora se você baixá-lo; por padrão, não mais do que peças #define DEFAULT_MMAP_MAX 65536
serão alocados usando mmap
. Isto pode ser alterado com mallopt(M_MMAP_MAX, count)
, mas usando muitos mmap
s tem uma sobrecarga.
As variáveis ??de ambiente MALLOC_MMAP_THRESHOLD_
etc. também irá definir estas opções.
Obviamente, a memória que aloca malloc
com mmap
é libertado com munmap
. Eu não tenho certeza se qualquer um isso está documentado em qualquer lugar fora do código-fonte do Glibc, ou tem quaisquer garantias de compatibilidade.
Outras dicas
C Interfaces e Implementações de Dave Hanson tem um cuidadosamente sintonizado-pool único alocador . Você poderia ligá-los juntos para fazer um alocador hierárquica, o que seria mais simples do que rolar seus próprios a partir do zero.
Você do ter resultados de perfil que a gerência da mostra de memória é um gargalo importante, certo? Ou você está apenas tentando simplificar a API para alocação?