2010-03-31 15 views
6

¿Por qué el boost :: fast_pool_allocator se construye sobre un pool singleton y no un pool por instancia de asignador? O para decirlo de otra manera, ¿por qué solo proporcionar eso, y no la opción de tener un grupo por asignador? ¿Tener eso sería una mala idea?boost pool_alloc

Tengo una clase que internamente utiliza alrededor de 10 diferentes tipos boost :: unordered_map. Si hubiera usado el asignador std ::, entonces toda la memoria volvería al sistema cuando se llamara delete, mientras que ahora tengo que llamar a release_memory en muchos tipos diferentes de asignador en algún momento. ¿Sería estúpido rodar mi propio asignador que use pool en vez de singleton_pool?

gracias

Respuesta

4

Es difícil para un asignador de tener estado, ya que todas las instancias de un asignador tenían que ser 'equivalente' para ser utilizado por la biblioteca estándar (al menos portable). se permiten

Implementaciones de recipientes descritos en esta norma suponer que su parámetro de plantilla Allocator cumpla con los siguientes dos requisitos adicionales más allá de los de la Tabla 32:

De 20.1.5/4 "requisitos asignador".

  • Todas las instancias de un tipo asignador dado están obligados a ser intercambiables y siempre comparan iguales entre sí

A continuación, pasa a decir: Se anima

implementadores para abastecer las bibliotecas que pueden aceptar asignadores que encapsulan los modelos de memoria más generales y que el apoyo casos no iguales. En tales implementaciones, cualquier requisito impuesto sobre los asignadores por los contenedores más allá de los requisitos que aparecen en la Tabla 32, y la semántica de los contenedores y los algoritmos cuando las instancias del asignador se comparan no iguales, están definidos por la implementación.

De modo que se puede escribir una implementación para permitir instancias de asignador no equivalentes, pero luego su asignador depende del comportamiento definido por la implementación.

Ver this other SO answer por algunos detalles adicionales (y parece que tengo que tienden a modernizarse prometida de esa respuesta ...)

+0

Hmm, errores destrozaron mi último comentario. Gracias por la explicación. Tal vez pueda salirse con la suya si me atengo al uso de unordered_map y evito unordered_map :: operator = o unordered_map :: swap –

+0

Esto realmente cambiará en C++ 0x. –