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 .

Foi útil?

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 mmaps 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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top