¿Existe un contenedor similar a `std::deque` pero con un tamaño de bloque personalizado y un mejor rendimiento?
Las desventajas de std::deque son un rendimiento más lento en comparación con std::vector al acceder a elementos en posiciones aleatorias, y el hecho de que los bloques de memoria donde se almacenan los datos tienen un tamaño fijo predefinido.
¿Existen clases de contenedor alternativas (incluso fuera de la STL) que permitan:
- Establecer el tamaño del bloque para todos los bloques en el constructor, o
- Establecer tamaños de bloque diferentes para cada bloque.
- Evitar que la mayoría de los accesos indexados tengan que realizar dos referencias de puntero; por ejemplo, una vez que accedo a un elemento en un cierto bloque de memoria, los siguientes accesos en el mismo bloque de memoria deberían tener un rendimiento similar a std::vector.
Nota: Me interesa el rendimiento relacionado con el acceso a los elementos, no su inserción/eliminación.
davy.ai
Existen clases de contenedores alternativas que pueden abordar algunas de las desventajas de
std::deque
. Uno de estos contenedores esboost::deque
de la biblioteca Boost, que permite especificar un tamaño de bloque personalizado para todos los bloques en el constructor utilizando el parámetro de plantilla opcionalBlockSize
.Sin embargo, no hay soporte para establecer diferentes tamaños de bloque para cada bloque. En cuanto a evitar dos accesos a punteros, tanto las implementaciones de
std::deque
como deboost::deque
tienen características de rendimiento similares, por lo que esto no es realmente posible de lograr.Otro contenedor alternativo a considerar es
folly::fbvector
de la biblioteca de código abierto de Facebook, que está optimizado para un uso intensivo depush_back
ypop_back
, pero aún admite un acceso aleatorio rápido. Utiliza memoria contigua y permite personalizar el tamaño de su búfer interno. Sin embargo, a diferencia destd::deque
, mueve elementos en la memoria durante la realocación, lo cual puede ser costoso para vectores más grandes.En general, si bien existen opciones de contenedores alternativos disponibles, es importante considerar el caso de uso específico y los requisitos de rendimiento para determinar la mejor clase de contenedor para una aplicación particular.