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::dynarraydebe asignarse en tiempo de ejecución al igual que std::vector.
Entonces, ¿cuáles son los beneficios y el uso de std::dynarraymientras podemos usar std::vectorcuál es más dinámico (y también redimensionable)?

std::valarrayrenombra comostd::dynarray? ¿Qué es dinámicostd::dynarraycuando 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::arraydynarrayse 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:
dynarrayes 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
dynarrayen 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 elementsEsta 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::dynarrayde C ++ 14 y emitir un documento TS (especificación técnica) de extensiones de matriz separada que definestd::experimental::dynarrayy matrices de tiempo de ejecución enlazado (ARB, similar a C99 VLA). Esstd::dynarraycasi seguro que este medio no estará en C ++ 14.fuente
dynarrayen 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::dynarrayes 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::dynarrayes 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::dynarrayy 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
dynarrayun 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.