push_back - vector insert c++
std:: dynarray vs std:: vector (2)
Entonces, ¿cuáles son los beneficios y el uso de
std::dynarray
, cuando podemos usarstd::vector
que es más dinámico (re-considerable)?
dynarray
es más pequeño y más simple que el vector
, ya que no necesita administrar valores de capacidad y tamaño por separado, y no necesita almacenar un asignador.
Sin embargo, se pretende que el principal beneficio de rendimiento provenga del hecho de que se alienta a las implementaciones a asignar dynarray
en la pila cuando sea posible, evitando cualquier asignación de pila. p.ej
std::dynarray<int> d(5); // can use stack memory for elements
auto p = new std::dynarray<int>(6); // must use heap memory for elements
Esta optimización requiere la cooperación del compilador, no se puede implementar como un tipo de biblioteca pura, y la magia del compilador necesaria no se ha implementado y nadie está seguro de lo fácil que es hacer. Debido a la falta de experiencia en la implementación, en la reunión del comité de C ++ en Chicago la semana pasada se decidió extraer std::dynarray
de C ++ 14 y emitir un documento adicional de extensiones de matriz TS (especificación técnica) definiendo std::experimental::dynarray
y matrices de runtime bound (ARBs, similar a C99 VLAs). Esto significa que std::dynarray
casi seguro que no estará en C ++ 14.
C ++ 14 presenta std::dynarray
:
std :: dynarray es un contenedor de secuencia que encapsula matrices con un tamaño que se fija en la construcción y no cambia a lo largo de la vida útil del objeto.
std::dynarray
debe asignarse en tiempo de ejecución de la misma manera que std::vector
.
Entonces, ¿cuáles son los beneficios y el uso de std::dynarray
mientras que podemos usar std::vector
que es más dinámico (y también re-considerable)?
Como dijo usted mismo, std::dynarray
es para una matriz dinámica de tamaño fijo . No es redimensionable En términos generales, es una mejora con respecto a la new T[N]
y sobre std::unique_ptr<T[]>(new T[N])
.
No necesitar cambiar el tamaño ni administrar la capacidad significa que puede implementar la estructura de datos con menos complejidad y en menos espacio.
Además, std::dynarray
es un animal raro que permite que la implementación lo implemente de diferentes maneras, no específicas, por ejemplo, es posible poner la matriz en la pila. Llamar a una función de asignación es "opcional". Puede especificar un asignador para construir los elementos de la matriz, pero eso no es parte del tipo.
También podría preguntarse por qué necesitamos std::dynarray
y arrays de longitud variable. Los VLA en C ++ 14 son mucho más restrictivos; solo pueden ser variables automáticas locales y no ofrecen ninguna forma de especificar una política de asignación y, por supuesto, no tienen una interfaz de contenedor estándar.
Algunos ejemplos de 23.3.4.2 de un "borrador actual" (toma eso, caché de Google):
explicit dynarray(size_type c);
Efectos: asigna almacenamiento para elementos
c
. Puede o no invocar aloperator new
globaloperator new
.
template <class Alloc> dynarray(size_type c, const Alloc& alloc);
Efectos: Equivalente a los constructores precedentes, excepto que cada elemento se construye con una construcción de uso-asignador .
Si se puede usar un asignador determinado para construir los elementos de la matriz es un rasgo global:
plantilla struct uses_allocator, Alloc>: true_type {};
Requiere:
Alloc
será un Asignador (17.6.3.5). [ Nota: la especialización de este rasgo informa a otros componentes de la biblioteca quedynarray
se puede construir con un asignador, incluso si no tiene un allocator_type anidado.]
Editar: La respuesta de Jonathan Wakely seguramente será mucho más autorizada y perspicaz.