2011-01-09 11 views
15

He oído hablar de personas que usan asignadores de memoria personalizados para su proyecto, particularmente en C++.C++: Asignadores de memoria

  • ¿Qué es un asignador de memoria personalizado, en comparación con malloc?

  • No está MALLOC el nivel más bajo se puede ir ya?

+1

@muntoo: que no menciona en absoluto asignadores. – jalf

+0

@jalf Todavía estoy aprendiendo a leer. –

Respuesta

18

asignador de memoria no es un nivel inferior de malloc. (El asignador por defecto normalmente llama malloc directa o indirectamente)

un asignador simplemente le permite especificar diferentes estrategias de asignación. Por ejemplo, puede usar un asignador que llame al malloc una vez para recuperar un grupo grande de memoria, y luego para solicitudes de asignación posteriores, simplemente devuelve un pequeño fragmento de este grupo.

O puede usarlo como un gancho para que pueda realizar alguna tarea adicional cada vez que la memoria se asigna o libera.

En cuanto a su segunda pregunta, malloc es la más baja se puede ir sin perder la portabilidad. malloc se implementa típicamente utilizando alguna función de asignación de memoria específica del sistema operativo, por lo que aún sería un nivel inferior. Pero eso no está relacionado con su pregunta principal, ya que los asignadores de C++ son una abstracción de mayor nivel.

+1

+ 1- Hay muchas estrategias de asignación, malloc es solo una que pretende ser lo más genéricamente posible. – Puppy

5

Un asignador de memoria personalizada es un reemplazo para malloc (en realidad, por lo general un reemplazo para operator new) que recupera los bloques de bytes de alguna manera distinta a la predeterminada. malloc no es el nivel más bajo que puede ir, porque el propio malloc se implementa en términos de primitivas aún más simples del sistema operativo que asignan bloques de memoria para particionar.

Los casos de uso común para hacer asignadores personalizados se optimizan para asignaciones de objetos pequeños (el asignador predeterminado suele ser realmente malo), asignando de manera que garantice una buena localidad (asignando objetos cerca unos de otros), asignando con el registro/tracking (para diagnosticar fugas), asignación desde un grupo de recursos recogidos basura, etc. Hay muchas opciones diferentes disponibles, y muchos programas pueden exprimir un poco más de rendimiento utilizando estos asignadores personalizados.

1

malloc() es una función de biblioteca en libc (o glibc) que hace que una llamada al sistema sbrk() cuando realmente necesita asignar más memoria al proceso. Juntos, malloc() y free() administran una lista de bloques de memoria que se usan cuando se invoca a malloc(), calloc() etc.

Se puede utilizar un asignador de costumbre cuando no se desea el comportamiento de malloc ('s) o si desea hacer un trabajo adicional en la parte superior de malloc/libre.

+1

'malloc' no llama a' sbrk() 'en Windows. ;) Eso es solo un detalle de implementación en su sistema operativo, nada que ver con 'malloc' en sí mismo. – jalf

+0

True :) Sesgos de plataforma ... –

16

Hay una extensa descripción de los asignadores personalizados, junto con su evaluación empírica, en el siguiente documento (que co-escribió). Antes de decidir utilizar asignadores personalizados en su proyecto C++, debe leer este documento. La visión general ejecutiva es un buen asignador de propósito general es mejor (más rápido y más eficiente en el uso del espacio) que todos los estilos de asignadores personalizados, excepto las regiones, pero estos tienen serios problemas.

Reconsidering personalizada de asignación de memoria (ACM link, direct PDF link, Powerpoint talk slides), OOPSLA 2002.

programadores con la esperanza de lograr mejoras en el rendimiento utilizan a menudo asignadores de memoria personalizado. Este estudio en profundidad examina ocho aplicaciones que usan asignadores personalizados . Sorprendentemente, para seis de estas aplicaciones, un asignador de propósito general de vanguardia (el asignador Lea ) funciona tan bien como mejor que los asignadores personalizados. Las excepciones de dos regiones, que ofrecen un mayor rendimiento (mejoras de hasta un 44%). Las regiones también reducen la carga del programador y eliminan una fuente de pérdidas de memoria. Sin embargo, mostramos que la incapacidad de los programadores para liberar objetos individuales dentro de las regiones puede dar lugar a un aumento considerable de en el consumo de memoria . Peor aún, esta limitación impide el uso de regiones de expresiones idiomáticas comunes de programación, reduciendo sus usefulness.We presentan una generalización de propósito general y asignadores de base regional que llamamos que siega. Las réplicas son una combinación de regiones y montones de , proporcionando un rango de semántica de región completo con la adición de eliminación de objetos individuales . Mostramos que nuestra implementación de cosechas ofrece un alto rendimiento , superando a otros asignadores con una semántica similar a una región. Luego utilizamos un caso de estudio para demostrar las ventajas de espacio y los beneficios de ingeniería de software de las cosechas en la práctica. Nuestros resultados indican que los programadores necesitan regiones rápidas debe utilizar es el que siega, y que la mayoría de los programadores considerando personalizados asignadores lugar debe utilizar el asignador Lea .

2

Los asignadores de memoria se utilizan como optimizaciones para la velocidad. Las asignaciones por el sistema operativo son lentas. Por lo tanto, su propio administrador de memoria toma una gran cantidad de memoria y luego realiza las asignaciones desde ese cubo de memoria sin pasar por el sistema operativo. Esta técnica se usa con mayor frecuencia en juegos/consolas/sistemas embebidos.

http://www.memorymanagement.org/articles/

http://www.ibm.com/developerworks/aix/tutorials/au-memorymanager/au-memorymanager-pdf.pdf

Cuestiones relacionadas