Pregunta

Mi aplicación se organiza principalmente en capas , así que descubrí que algo así como el Las agrupaciones de memoria APR serían la mejor manera.

Mientras lee en SO sobre C ++ colocación nueva publica aquí & amp; aquí , y una pregunta de asignación C más genérica estaba pensando en crear a mano un asignador jerárquico de grupos como se sugirió en una publicación, pero en la pura tradición de la JNI primero pregunto si ya existe algo como esto.

También podría tener la buena propiedad de poder devolver memoria no utilizada al sistema operativo (ya que la asignación podría hacerse con mmap (MAP_ANON) ) o podría ser asignando desde la pila como se sugiere Ferrucico aquí .

¿Fue útil?

Solución

Sé de otro buen asignador jerárquico de memoria, pero llama a malloc debajo de las cubiertas.

  

talloc es un asignador de memoria jerárquico basado en agrupaciones con destructores. Es el asignador de memoria central utilizado en Samba4, y ha marcado una gran diferencia en muchos aspectos del desarrollo de Samba4.

     

Para comenzar con talloc, le recomendaría que lea la guía de talloc .

Dicho esto, el malloc de Glibc ya usa mmap (MAP_ANON) para una asignación mayor que mmap_threshold , que puede configurar a través de mallopt (M_MMAP_THRESHOLD, bytes) . Por defecto, se ajusta dinámicamente 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

Cuidado si lo bajas; de manera predeterminada, no se asignarán más de #define DEFAULT_MMAP_MAX 65536 piezas utilizando mmap . Esto se puede cambiar con mallopt (M_MMAP_MAX, count) , pero el uso de muchos mmap s tiene una sobrecarga.

Las variables de entorno MALLOC_MMAP_THRESHOLD_ etc. también establecerán estas opciones.

Obviamente, la memoria que malloc asigna con mmap se libera con munmap . No estoy seguro si algo de esto está documentado fuera del código fuente de Glibc, o si tiene alguna garantía de compatibilidad.

Otros consejos

Dave Hanson C Interfaces e implementaciones tiene un asignador de grupo único cuidadosamente ajustado . Podrías vincularlos para crear un asignador jerárquico, lo que sería más simple que rodar el tuyo desde cero.

Usted tiene resultados de perfil que muestran que la administración de memoria es un cuello de botella significativo, ¿verdad? ¿O simplemente está tratando de simplificar la API para la asignación?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top