¿Debería el código C++ nuevo utilizar recursos de memoria en lugar de asignadores?
memory-management c++17 (1)
En este punto no.
Los asignadores en C ++ actualmente son mucho más fáciles de lo que solían ser.
Proporcionan soporte tanto para pmr como para el asignador clásico.
Más importante aún, la asignación basada en pmr no se ha usado mucho durante años. Cualquier debilidad aún puede salir a la luz.
Los asignadores basados en agrupaciones rápidas, o incluso los de búfer fijo o las extensiones sbo, pueden notar la sobrecarga de la virtualización.
C ++ 17 nos traerá std::pmr::memory_resource
que es una interfaz limpia para asignar y desasignar memoria. A diferencia del concepto de Allocator , hace eso y nada más. También habrá std::pmr::polymorphic_allocator
que envuelve un recurso de memoria en un asignador clásico para que pueda usarse con los contenedores existentes.
Si estoy a punto de escribir un nuevo tipo de contenedor (u otro tipo hambriento de memoria) orientado a C ++ 17 y posterior, ¿debo continuar programando contra el concepto de Asignador o, más bien, usar la abstracción más nueva y más limpia directamente?
A partir de ahora, mis pensamientos son así.
Razones para continuar usando asignadores:
- Es consistente con la biblioteca estándar y el código existente. Incluso los nuevos alias de contenedor
std::pmr::*
continúan utilizando los asignadores. - Dado que un recurso de memoria se puede envolver en un
std::pmr::polymorphic_allocator
, la interfaz del asignador es más general y satisface las necesidades de más clientes. - Los recursos de memoria siempre utilizan el polimorfismo en tiempo de ejecución, por lo que tienen una sobrecarga adicional de tiempo de ejecución adicional en comparación con la abstracción de cero de sobrecarga que los asignadores pueden proporcionar.
- Tal vez alguien realmente necesite las otras partes de la interfaz del asignador (como los tipos de punteros personalizados) que no pueden ser proporcionados por un recurso de memoria pura.
Razones para comenzar a usar recursos de memoria en lugar de asignadores:
- La interfaz del asignador es torpe y difícil de implementar. La interfaz
std::pmr::memory_resource
es limpia y directa. - Dado que los recursos de memoria son polimórficos, no afectan el tipo de contenedor, lo que significa menos instancias de plantillas (y, por lo tanto, compilaciones más rápidas y ejecutables más pequeños) y nos permite mover más código a unidades de traducción separadas.
- Si un objeto usa un recurso de memoria, siempre puede crear una instancia de un subobjeto que aún usa asignadores envolviendo el recurso de memoria en un
std::pmr::polymorphic_allocator
. Lo contrario es más difícil. - La asignación de memoria es una tarea relativamente laboriosa de todos modos. Una sola llamada de función virtual no agrega mucha sobrecarga, relativamente hablando.
¿Ya existen recomendaciones sobre cómo usar la nueva función de biblioteca de manera efectiva?