Compartir a través de


<allocators>

Define varias plantillas que ayudan a asignar y liberar bloques de memoria para contenedores basados en nodos.

Sintaxis

#include <allocators>

Nota:

<allocators> está en desuso a partir de Visual Studio 2019, versión 16.3.

Comentarios

El encabezado <allocators> proporciona seis plantillas de asignador que se pueden usar para seleccionar estrategias de administración de memoria para los contenedores basados en nodos. Para su uso con estas plantillas, también proporciona varios filtros de sincronización diferentes para adaptar la estrategia de administración de memoria a una serie de esquemas multithreading distintos (incluso ninguno). Puede acelerar la aplicación o reducir sus requisitos de memoria mediante la coincidencia de una estrategia de administración de memoria con sus patrones de uso de memoria y los requisitos de sincronización.

Las plantillas de asignador se implementan con componentes reutilizables que se pueden personalizar o reemplazar a fin de proporcionar estrategias de administración de memoria adicionales.

Los contenedores basados en nodos de la biblioteca estándar de C++ (std::list, std::set, std::multiset, std::map y std::multimap) almacenan sus elementos en nodos individuales. Todos los nodos de un tipo de contenedor determinado tienen el mismo tamaño, por lo que no es necesaria la flexibilidad de un administrador de memoria de propósito general. Dado que se conoce el tamaño de cada bloque de memoria en tiempo de compilación, el administrador de memoria puede ser mucho más rápido y sencillo.

Cuando se usan con contenedores que no están basados en nodos (por ejemplo, los contenedores std::vector std::deque y std::basic_string de la biblioteca estándar de C++), las plantillas de asignador funcionan correctamente, pero no es probable que proporcionen ninguna mejora de rendimiento con respecto al asignador predeterminado.

Un asignador es una plantilla de clase que describe un objeto que administra la asignación de almacenamiento y la liberación de objetos y matrices de objetos de un tipo designado. Los objetos de asignador son usados por varias plantillas de clase de contenedor de la biblioteca estándar de C++.

Los asignadores son todos plantillas de este tipo:

template<class Type>
class allocator;

donde el argumento de plantilla Type es el tipo administrado por la instancia de asignador. La biblioteca estándar de C++ proporciona un asignador predeterminado, la plantilla de clase allocator, que se define en <memory>. El encabezado <allocators> proporciona los asignadores siguientes:

Use una creación de instancias adecuada de un asignador como segundo argumento de tipo al crear un contenedor, como en el ejemplo de código siguiente.

#include <list>
#include <allocators>
std::list<int, stdext::allocators::allocator_chunklist<int> > _List0;

_List0 asigna nodos con allocator_chunklist y el filtro de sincronización predeterminado.

Use la macro ALLOCATOR_DECL para crear plantillas de asignador con filtros de sincronización que no sean los predeterminados:

#include <list>
#include <allocators>
ALLOCATOR_DECL(CACHE_CHUNKLIST, stdext::allocators::sync_per_thread, Alloc);
std::list<int, alloc<int> > _List1;

_Lst1 asigna nodos con allocator_chunklist y el filtro de sincronización sync_per_thread.

Un asignador de bloques es una memoria caché o un filtro. Una memoria caché es una plantilla de clase que toma un argumento de tipo std::size_t. Define un asignador de bloques que asigna y desasigna bloques de memoria de un tamaño único. Debe obtener memoria mediante el operador new, pero no necesita realizar una llamada independiente al operador new para cada bloque. Por ejemplo, puede subasignar desde un bloque mayor o almacenar en caché bloques desasignados para una reasignación posterior.

Con un compilador que no puede reenlazar el valor del argumento std:: size_t empleado al crear una instancia de la plantilla no es necesariamente el valor del argumento _Sz pasado a las funciones miembro allocate y deallocate de una memoria caché.

<allocators> proporciona las siguientes plantillas de caché:

Un filtro es un asignador de bloques que implementa sus funciones miembro mediante otro asignador de bloques que se le pasa como un argumento de plantilla. La forma más común de filtro es un filtro de sincronización, que aplica una directiva de sincronización para controlar el acceso a las funciones miembro de una instancia de otro asignador de bloques. <allocators> proporciona los siguientes filtros de sincronización:

<allocators> también proporciona el filtro rts_alloc, que contiene varias instancias del asignador de bloques y determina la instancia que se va a usar para la asignación o desasignación en tiempo de ejecución, y no en tiempo de compilación. Se usa con los compiladores que no se pueden reenlazar mediante compilación.

Una directiva de sincronización determina cómo controla una instancia de asignador las solicitudes de asignación y desasignación simultáneas desde varios subprocesos. La directiva más sencilla es pasar todas las solicitudes directamente al objeto de caché subyacente, dejando la administración de la sincronización al usuario. Una directiva más compleja podría consistir en usar una exclusión mutua para serializar el acceso al objeto de caché subyacente.

Si un compilador admite la compilación de aplicaciones de un único subproceso y de varios, el filtro de sincronización predeterminado para las aplicaciones de un único subproceso es sync_none; en todos los demás casos, es sync_shared.

La plantilla caché cache_freelist toma un argumento de clase máxima que determina el número máximo de elementos que se van a almacenar en la lista libre.

<allocators> proporciona las siguientes clases máximas:

Macros

Macro Descripción
ALLOCATOR_DECL Da como resultado una plantilla de clase de asignador.
CACHE_CHUNKLIST Produce stdext::allocators::cache_chunklist<sizeof(Type)>.
CACHE_FREELIST Produce stdext::allocators::cache_freelist<sizeof(Type), max>.
CACHE_SUBALLOC Produce stdext::allocators::cache_suballoc<sizeof(Type)>.
SYNC_DEFAULT Da como resultado un filtro de sincronización.

Operadores

Operador Descripción
operator!= (<allocators>) Comprueba la desigualdad entre los objetos de asignador de una clase especificada.
operator== (<allocators>) Comprueba la igualdad entre los objetos de asignador de una clase especificada.

Clases

Clase Descripción
allocator_base Define la clase base y las funciones comunes necesarias para crear un asignador definido por el usuario a partir de un filtro de sincronización.
allocator_chunklist Describe un objeto que administra la asignación de almacenamiento y la liberación de objetos mediante una memoria caché de tipo cache_chunklist.
allocator_fixed_size Describe un objeto que administra la asignación de almacenamiento y la liberación de objetos de tipo Type mediante una memoria caché de tipo cache_freelist con una longitud administrada por max_fixed_size.
allocator_newdel Implementa un asignador que usa el operador delete para desasignar un bloque de memoria y el operador nuevo para asignar un bloque de memoria.
allocator_suballoc Describe un objeto que administra la asignación de almacenamiento y la liberación de objetos de tipo Type mediante una memoria caché de tipo cache_suballoc.
allocator_unbounded Describe un objeto que administra la asignación de almacenamiento y la liberación de objetos de tipo Type mediante una memoria caché de tipo cache_freelist con una longitud administrada por max_unbounded.
allocator_variable_size Describe un objeto que administra la asignación de almacenamiento y la liberación de objetos de tipo Type mediante una memoria caché de tipo cache_freelist con una longitud administrada por max_variable_size.
cache_chunklist Define un asignador de bloques que asigna y desasigna bloques de memoria de un tamaño único.
cache_freelist Define un asignador de bloques que asigna y desasigna bloques de memoria de un tamaño único.
cache_suballoc Define un asignador de bloques que asigna y desasigna bloques de memoria de un tamaño único.
freelist Administra una lista de bloques de memoria.
max_fixed_size Describe un objeto de clase máxima que limita un objeto freelist a una longitud máxima fija.
max_none Describe un objeto de clase máxima que limita un objeto freelist a una longitud máxima de cero.
max_unbounded Describe un objeto de clase máxima que no limita la longitud máxima de un objeto freelist.
max_variable_size Describe un objeto de clase máxima que limita un objeto freelist a una longitud máxima que es aproximadamente proporcional al número de bloques de memoria asignados.
rts_alloc La plantilla de clase rts_alloc describe un filtro que contiene una matriz de instancias de caché y determina la instancia que se va a usar para la asignación y la desasignación en tiempo de ejecución, y no en tiempo de compilación.
sync_none Describe un filtro de sincronización que no proporciona ninguna sincronización.
sync_per_container Describe un filtro de sincronización que proporciona un objeto de caché independiente para cada objeto de asignador.
sync_per_thread Describe un filtro de sincronización que proporciona un objeto de caché independiente para cada subproceso.
sync_shared Describe un filtro de sincronización que usa una exclusión mutua para controlar el acceso a un objeto de caché compartido por todos los asignadores.

Requisitos

Encabezado:<allocators>

Espacio de nombres: stdext

Consulte también

Referencia de archivos de encabezado