2010-08-10 20 views
10

Estoy buscando un tipo de datos C++ similar a std::vector pero sin los gastos generales relacionados con el cambio de tamaño dinámico. El tamaño del contenedor permanecerá constante a lo largo de su vida útil. Consideré usar boost::array, sin embargo, eso no es apropiado porque requiere que el tamaño de la matriz sea conocido en tiempo de compilación, que no es el caso en mi situación.vector con tamaño constante

Respuesta

15

Mida si el cambio de tamaño dinámico realmente tiene algún impacto en el rendimiento antes de usar algo no estándar.

Consejo: Con vector.reserve, nunca habrá ninguna reasignación de matriz.

4

La sobrecarga inducida por la capacidad de cambio de tamaño dinámico de std::vector es prácticamente inexistente.

Si necesita una matriz de tamaño de tiempo de compilación, en muchos casos sería una buena idea buscar algo más eficiente que std::vector.

Pero la diferencia entre el tamaño de tiempo de ejecución fijo y el tamaño de tiempo de ejecución dinámico es despreciable. std::vector es una solución perfecta en este caso.

2

He utilizado una clase de plantilla basada en ideas de STLSoft's auto_buffer (he improvisado mi propia implementación del libro Imperfect C++ de Matthew Wilson junto con algunas ideas de la implementación de STLSoft). Asigna la matriz por defecto en la pila (o incrustado en el objeto de la clase) si es lo suficientemente pequeña (en función de un parámetro de plantilla que proporcione). Si la asignación de tiempo de ejecución es mayor que eso, el almacenamiento de la matriz proviene del montón.

http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html

Así que lo bueno de esta clase es que para tamaños pequeños más pequeños, la asignación es esencialmente un no-op.

+0

+1 por golpearme al buffer automático. :) Boost tiene uno [para revisión] (http://www.boost.org/community/review_schedule.html). – GManNickG

+0

@Zenikoder: 'auto_buffer <>' no es parte de la STL. –

10

No hay gastos generales en la reasignación si no reasigna std :: vector. Así que o bien:

  • construir el std :: vector con un tamaño conocido por delante (std::vector x(100))
  • reserva de llamada (n) después de la construcción para asegurarse de que al menos n elementos pueden ser empujados en el vector antes de que ocurra la reasignación .
1

Si no se conoce el tamaño de la matriz en tiempo de compilación, la única opción en C++ es una matriz asignada dinámicamente. Puede usar un std::vector para garantizar RAII. Como han dicho otros, el hecho de que std::vector s se pueda cambiar de tamaño no significa que tenga que cambiar su tamaño. Cree el std::vector con el tamaño correcto y luego no llame a nada que pueda redimensionarlo.

Cuestiones relacionadas