una - ¿Por qué ambas matrices del tamaño del tiempo de ejecución y std:: dynarray en C++ 14?
matriz en c++ codigo (3)
Como dijo usted mismo, std::dynarray
proporcionará una interfaz de estilo STL, lo que lo hace más idiomático de usar. Aún así, C ++ necesita matrices dinámicas creadas con new[]
para:
- al menos implemente
std::dynarray
(para que no pueda tener dynarray sin new []) - retener compatibilidad con versiones anteriores
No puede simplemente decir que todo el código, que usa new [], ahora es incorrecto.
En general, la diferencia entre C ++ 14 std::dynarray
y C ++ new[]
array es casi la misma que entre C ++ 11 std::array
y C-style arrays.
UPD: Ahora veo que ahora está preguntando por características similares a C11 (VLA). En realidad, no hay nada que ver con eso: los VLA son muy limitados y solo puede usar un argumento de la función como su tamaño de matriz. Además, la memoria se asigna en la pila, pero para la memoria std::dynarray
se asigna en el montón. Básicamente, esta característica simplemente amplía las matrices estilo C y hace que C ++ sea un poco más compatible con el estándar C moderno.
El borrador de C ++ 14 incluye matrices del tamaño del tiempo de ejecución y el contenedor std::dynarray
. Por lo que puedo decir, la única diferencia real entre los dos es que std::dynarray
tiene una interfaz STL (por ejemplo, begin
, end
, size
, etc.), mientras que las matrices de tamaño de tiempo de ejecución no lo hacen. Entonces, ¿por qué C ++ 14 los necesita a ambos?
Entiendo que las matrices del tamaño de tiempo de ejecución son parte del lenguaje central, mientras que std::dynarray
es parte de la biblioteca estándar, pero la propuesta de std::dynarray
deja en claro que los autores esperan que los compiladores, en muchos casos, ofrezcan soporte especial para std::dynarray
para que pueda ser lo más eficiente posible, es decir, tan eficiente como una matriz del tamaño del tiempo de ejecución. Como tal, la distinción lenguaje / biblioteca parece algo artificial.
Entonces, de nuevo, ¿por qué C ++ 14 necesita arreglos del tamaño del tiempo de ejecución y std::dynarray
? Y dado que std::dynarray
tiene una interfaz más rica (STLified), ¿por qué no simplemente descartar matrices del tamaño de la ejecución, suponiendo que std::dynarray
se puede implementar con la misma eficacia de tiempo de ejecución?
Aclaración
Cuando hablo de "matrices de tamaño de tiempo de ejecución", me refiero a una nueva característica de lenguaje central C ++ 14 que se describe en N3639 , no a arrays C tradicionales o VLA ni nada en C ++ 11.
Creo que usted respondió la pregunta usted mismo, std::dynarray
tiene la interfaz stl. Un objetivo de c ++ 11 y supongo que c ++ 14 es hacer que c ++ sea más fácil de usar, menos propenso a errores y más fácil para los principiantes. Con las matrices de estilo c, puede encontrarse con problemas aritméticos de puntero, pero dynarray
evita los problemas si se usa como estaba previsto.
EDITAR: por lo que parece que una diferencia es que las matrices del tamaño del tiempo de ejecución deben asignarse en la pila, lo que aumenta la probabilidad de un desbordamiento de la pila. dynarray
se asigna en el montón aunque es posible asignar en la pila (si la implementación lo hizo)
N3639 propone agregar matrices locales del tamaño del tiempo de ejecución con una duración de almacenamiento automática en C ++.
N2648 dice que de acuerdo con la práctica de C ++, std::dynarray
s se puede usar con más que solo variables automáticas. Pero para aprovechar la asignación de la pila de eficiencia, deseamos que dynarray
optimizable cuando se usa como una variable automática.
En resumen, las matrices de tamaño de tiempo de ejecución C11 están restringidas para ser almacenadas en la pila. dynarray
no lo es, pero puede optimizarse cuando se almacena en la pila para que sea tan eficiente como las matrices de tamaño de tiempo de ejecución C11 (o al menos así es el objetivo).
Las matrices de tamaño de tiempo de ejecución C11 pueden ser una sintaxis útil, y el costo para aumentar la intercomunicación con C no es alto: el mecanismo tendría que implementarse para un dynarray
automático eficiente de dynarray
modos. Además, las matrices de tamaño de tiempo de ejecución C11 son ciudadanos de primera clase, y existen independientemente del uso de bibliotecas std
por el programador.
Existen diferencias importantes entre las matrices reales del tamaño del tiempo de ejecución C11 y las matrices del tamaño del tiempo de ejecución C ++ 1y C11, entre ellas, el tamaño del tiempo de ejecución que admiten las matrices reales del tamaño del tiempo de ejecución C11. Pero su uso básico puede ser compatible.
Tenga en cuenta que, al final, ninguno de los dos se agregó en C ++ 14.