std :: dynarray vs std :: vector

84

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)?

masoud
fuente
1
Oye, ¿desde cuándo es "C ++ 14" una etiqueta? Estaba buscando eso el otro día y no existía ...
Kerrek SB
1
¿Se std::valarrayrenombra como std::dynarray? ¿Qué es dinámico std::dynarraycuando no se puede cambiar el tamaño?
yasouser
9
@yasouser, no, no tiene nada que ver 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
Jonathan Wakely
21
Tenga en cuenta que en la reunión del Comité de Estándares de C ++ la semana pasada, dynarrayse 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.
Pete Becker
2
dynarray ya no es parte del borrador de C ++ 14
cassinaj

Respuestas:

90

Entonces, ¿cuáles son los beneficios y el uso de std::dynarray, cuándo podemos usar std::vectorcuál es más dinámico (redimensionable)?

dynarrayes más pequeño y más simple que vector, 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.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 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 define std::experimental::dynarrayy matrices de tiempo de ejecución enlazado (ARB, similar a C99 VLA). Es std::dynarraycasi seguro que este medio no estará en C ++ 14.

Jonathan Wakely
fuente
1
Grande, me preguntaba si había alguna implementaciones no triviales de 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.
Kerrek SB
No, no se conocen implementaciones de una asignación de pila 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!)
Jonathan Wakely
solo estoy haciendo una lluvia de ideas aquí, pero ¿qué pasa con la creación de 2 funciones: std :: dynarray make_dyn_autostorage (int) y std :: dynarray make_dyn_heap (int)?
Servir Laurijssen
2
@KerrekSB, sí, el movimiento de biblioteca 10 en Chicago fue: "Move, creamos un documento de trabajo para un TS de extensiones de matriz planificado, elimina las ediciones aplicadas al CD de C ++ 14 por los dos documentos N3639 ", matrices de tamaño de tiempo de ejecución con duración del almacenamiento (revisión 5) " N3662 ," C ++ Dynamic Arrays (dynarray) "y pida al editor del proyecto Array Extensions TS que aplique esas palabras al documento de trabajo de Array Extensions como contenido inicial".
Jonathan Wakely
3
@ h9uest que no tiene nada que ver con "los chicos de C ++", esos son los nombres oficiales de los entregables de un comité técnico de ISO , consulte iso.org/iso/home/standards_development/… e iso.org/iso/home/standards_development /…
Jonathan Wakely
31

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 una new T[N]y otra vez std::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::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):

explicit dynarray(size_type c);

Efectos: asigna almacenamiento para celementos. Puede o no invocar lo global operator new.

template <class Alloc>
dynarray(size_type c, const Alloc& alloc);

Efectos: Equivalente a los constructores anteriores excepto que cada elemento se construye con una construcción de asignador de usos .

Aun cuando no se puede utilizar un asignador dada para construir los elementos de la matriz es un rasgo mundial:

template struct uses_allocator, Alloc>: true_type {};

Requiere: Alloc debe ser un Asignador (17.6.3.5). [ Nota: la especialización de este rasgo informa a otros componentes de la biblioteca que dynarrayse pueden construir con un asignador, aunque no tenga un allocator_type anidado].

Editar: La respuesta de Jonathan Wakely seguramente será mucho más autorizada y perspicaz.

Kerrek SB
fuente
Pasar un asignador a 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.
Jonathan Wakely
@JonathanWakely: Ah, lo entendí mal. ¡Gracias, arreglado!
Kerrek SB