Shenzhen Tianteng Industry Co., Ltd
You Are Here:Inicio > NOTICIAS > Contenido
Distribuidor autónomo
Jun 25, 2018

Una de las principales razones para definir un asignador personalizado es mejorar el rendimiento. Usando un asignador personalizado dedicado puede mejorar el rendimiento del programa, o mejorar la eficiencia de uso de memoria, o ambos. El asignador predeterminado utiliza el operador new para asignar espacio de almacenamiento, que a menudo es implementado utilizando la función de asignación de montón de lenguaje C (malloc()). Puesto que la función de asignación de montón a menudo está optimizada para asignaciones de memoria esporádica, el asignador predeterminado es generalmente eficiente al asignar memoria para recipientes que necesitan asignar grandes cantidades de memoria a la vez (por ejemplo, vector, deque). Sin embargo, para los contenedores asociativos y las listas doblemente enlazadas, que necesitan asignar una pequeña cantidad de memoria con frecuencia, si el asignador predeterminado asigna memoria, es generalmente ineficaz. Además, el asignador predeterminado basado en malloc() tiene muchos problemas, como la pobre localidad referencial y puede provocar la fragmentación de memoria.

En vista de ello, en este caso, personas utilizan asignadores de memoria basada en la piscina para resolver el problema de frecuentes asignaciones pequeñas. A diferencia del método por defecto "asignación a pedido", cuando con un grupo de memoria base de asignador, el programa destinará una gran cantidad de memoria "(piscina de la memoria del) de antemano y luego, cuando la necesidad de asignar memoria, el asignador personalizado único puntero a la memoria en la piscina debe ser regresada al solicitante. Cuando el objeto es destruido, no es necesario realmente desasignar la memoria. En cambio, la desafectación real se retrasa hasta el final del ciclo de vida de la piscina de la memoria.

Sobre el tema de"Custom", muchos expertos en C++ y autores relacionados con ya han participado en debates, tales como "STL efectiva" de Scott Meyers y "C ++ moderno" de Andre Alexandre Rescu se ha mencionado. Ideas de Meyers que si todas las instancias de un dispensador para un determinado tipo T debe ser igual, las instancias de dispensadores portátiles no deben contener ningún Estado. Aunque el estándar C++ anima a ejecutores de la biblioteca para apoyar con dispensadores, Meyers dijeron que los párrafos pertinentes son "(looks like) un punto de vista maravilloso," pero son palabras casi vacías y afirman que las restricciones de la distribuidora son "muy duras ". Por ejemplo, lista de STL permite el método de empalme, es decir se puede mover un nodo de objeto de lista A directamente a otro objeto de la lista B. Esto requiere que la memoria asignada de un asignador de puede ser liberado por el asignador de B, derivando así las instancias de distribuidor para A y B deben ser iguales. Myers llega a la conclusión de que el distribuidor se define mejor como un tipo que utiliza métodos estáticos. Por ejemplo, según el estándar de C++, distribuidor debe proporcionar una plantilla de otra clase que implementa el método rebind.

Además, en el "C ++ Programming Language", Bianni Strawstrup considera que "'restringir estrictamente el distribuidor, así como no a diferente información de cada objeto', obviamente no es un problema" (para el efecto), y se señala que la mayoría distribuidores no necesitan estado, y aunque no hay ningún Estado, el funcionamiento es mejor. Propuso tres casos de uso dispensador personalizado: una memoria tipo, un tipo de memoria compartida y un tipo de colección de basura de la piscina y demostró la implementación de un divisor, con una piscina de la memoria interna de rapidez. Una pequeña cantidad de memoria asignar/Deallocate. Sin embargo, también mencionó que tal optimización puede han sido implementado en el distribuidor de muestra que proporcionó.

Otro uso del asignador personalizado es depurar errores relacionados con la memoria. Para ello, puede escribir un asignador que asigna memoria adicional cuando se asigna y utilizarla para almacenar información de depuración. Este tipo de asignador no sólo garantiza que la memoria es asignada/de-allocated por el mismo tipo de asignador, pero también protege el programa de desbordamiento de búfer en cierta medida.