2011-07-28 8 views

Respuesta

14

se parece a la característica de asignadores con estado en contenedores STL es ampliamente soportado ya. En la mayoría de los casos, la uniformidad del asignador no causa problemas. Lo que todavía no se admite ampliamente es la forma en que el nuevo estándar maneja las situaciones problemáticas (intercambio de un contenedor (si también se cambia el asignador), empalme de listas).

This thread dice:

en código para la mayoría de las bibliotecas estándar actuales (incluyendo de usadas por MS Dinkumware), asignadores con estado son compatibles

This tread (libstdC++, 2004) dice (si he entendido correctamente):

Ya apoyamos asignadores donde l1.get_allocator() != l2.get_allocator(). Lo que no hacemos es tomar disposiciones especiales para detectar los asignadores en splice() y swap().

This blog entry (libstdC++, 2009) dice:

contenedores existentes en el modo C++ 0x son ahora más eficiente junto con asignadores de estado (es decir, no hay asignadores se crean sobre la marcha en el momento de la construcción elemento)

This document dice acerca de la nueva libc++ library:

Todos los contenedores cumplen con todos los requisitos más recientes asignador que apoyan totalmente asignadores con estado. - Espacio para asignadores sin estado optimizados de distancia.

EASTL es compatible con las asignaciones statefull.

This thread contiene una disputa interesante acerca de cuán portátil es esta característica.

Por lo tanto, la mayoría de las implementaciones STL admiten asignaciones statefull, lo que significa que no crean instancias adicionales del tipo de asignador bajo el capó, pero almacenan la instancia del asignador suministrado por el cliente y todas las asignaciones/desasignación se realizan a través de eso. Sin embargo, la forma en que manejan swap ping y list::splice no está documentada, no es portátil.

ACTUALIZACIÓN: VSL de VS2008 requiere que los asignadores tengan el constructor de copia con plantilla, que IMO imposibilita el uso más importante de asignadores personalizados: almacenamiento segregado simple.

Para quien no esté satisfecho con el estado actual de las asignaciones con estado en STL, recomiendo considerar Boost.Intrusive y Boost.Container.

+0

En realidad, todas las bibliotecas estándar requieren asignadores para tener un constructor de copia con plantilla y la plantilla 'rebind' y usarlos. Esto se debe a que todos los contenedores, excepto 'vector' y' deque', asignan los elementos como parte de alguna estructura definida por la implementación, por lo que deben crear un asignador para esa estructura a partir del asignador provisto. Eso es algo que el autor asignador simplemente tiene que tener en cuenta. –

Cuestiones relacionadas