Implementación de pools de memoria en C

Estoy buscando una buena implementación de pool de memoria en C.

Debe incluir lo siguiente:

  1. Anti fragmentación.
  2. Se super rápido 🙂
  3. Capacidad de “agrupar” varias asignaciones de diferentes tamaños bajo algún identificador y eliminar todas las asignaciones con el identificador dado.
  4. A salvo de amenazas

Creo que el excelente talloc , desarrollado como parte de la samba puede ser lo que estás buscando. La parte que me parece más interesante es que cualquier puntero devuelto desde talloc es un contexto de memoria válido. Su ejemplo es:

 struct foo *X = talloc(mem_ctx, struct foo); X->name = talloc_strdup(X, "foo"); // ... talloc_free(X); // frees memory for both X and X->name 

En respuesta a sus puntos particulares:

(1) No estoy seguro de qué es la anti-fragmentación en este caso. De todos modos, en C no va a obtener una recolección compacta de basura, así que creo que sus opciones son algo limitadas.

(2) Anuncia que es solo un 4% más lento que malloc(3) simple malloc(3) , que es bastante rápido.

(3) Ver ejemplo arriba.

(4) Es seguro para subprocesos siempre que los diferentes subprocesos utilicen contextos diferentes y el malloc subyacente sea seguro para subprocesos.

Has mirado en

Ambos aprovechan un grupo de memoria pero lo mantienen en su mayoría transparente para el usuario.

En general, encontrará el mejor rendimiento en su propio grupo de memoria personalizado (puede optimizar para su patrón). Terminé escribiendo unos cuantos para diferentes patrones de acceso.

Para las agrupaciones de memoria que se han probado y probado a fondo, es posible que desee utilizar solo las APR:

http://apr.apache.org/docs/apr/1.4/apr__pools_8h.html

Eso sí, las piscinas individuales no son seguras para subprocesos, tendrás que manejarlo tú mismo.

Bget es otra opción. Está bien probado y listo para la producción.

http://www.fourmilab.ch/bget/