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 durante la vida útil del objeto.
std::dynarray
debe asignarse en tiempo de ejecución al igual que std::vector
.
Entonces, ¿cuáles son los beneficios y el uso de std::dynarray
mientras podemos usar std::vector
cuál es más dinámico (y también redimensionable)?
std::valarray
renombra comostd::dynarray
? ¿Qué es dinámicostd::dynarray
cuando no se puede cambiar el tamaño?valarray
. Es dinámico porque la longitud de la matriz es un valor de tiempo de ejecución, no tiene por qué ser conocido en tiempo de compilación, a diferencia destd::array
dynarray
se eliminó de C ++ 14 y se incluyó en una Especificación Técnica futura (piense en eso como una nueva versión de TR1) porque tiene algunos problemas técnicos serios.Respuestas:
dynarray
es más pequeño y más simple quevector
, porque no necesita administrar valores separados de tamaño y capacidad, y no necesita almacenar un asignador.Sin embargo, se pretende que el principal beneficio de rendimiento provenga del hecho de que se anima a las implementaciones a asignar
dynarray
en la pila cuando sea posible, evitando cualquier asignación de montón. p.ejstd::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 hacerlo. Debido a la falta de experiencia en implementación, en la reunión del comité de C ++ en Chicago la semana pasada se decidió sacar
std::dynarray
de C ++ 14 y emitir un documento TS (especificación técnica) de extensiones de matriz separada que definestd::experimental::dynarray
y matrices de tiempo de ejecución enlazado (ARB, similar a C99 VLA). Esstd::dynarray
casi seguro que este medio no estará en C ++ 14.fuente
dynarray
en la naturaleza. Siempre pensé que se necesitan dos implementaciones independientes de la práctica existente antes de que algo sea elegible para la estandarización.dynarray
. Aunque la experiencia de implementación es muy útil, no hay una regla establecida que la requiera (¡pero algunos dirían que debería haberla!)Como usted mismo dijo,
std::dynarray
es para una matriz dinámica de tamaño fijo . No es de tamaño variable. En términos generales, es una mejora unanew T[N]
y otra vezstd::unique_ptr<T[]>(new T[N])
.No necesitar cambiar el tamaño o 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 extraño que permite que la implementación lo implemente de diferentes formas no específicas, por ejemplo, es posible colocar 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 puede ser que preguntarse por qué necesitamos
std::dynarray
y matrices de longitud variable. Los VLA en C ++ 14 son mucho más restrictivos; solo pueden ser variables locales, automáticas y no ofrecen 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" (tome eso, caché de Google):
Aun cuando no se puede utilizar un asignador dada para construir los elementos de la matriz es un rasgo mundial:
Editar: La respuesta de Jonathan Wakely seguramente será mucho más autorizada y perspicaz.
fuente
dynarray
un constructor nunca se usa para la asignación, solo se usa como un argumento para los constructores de los elementos (usando la "construcción usa-asignador"). Es por eso que no puede consultar si se usó el asignador: porque nunca lo es.