es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Existen clases de contenedores alternativas que pueden abordar algunas de las desventajas de std::deque. Uno de estos contenedores es boost::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 opcional BlockSize.

    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 de boost::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 de push_back y pop_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 de std::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.

Comments are closed.