¿Por qué tanto los arrays de tamaño runtime como std:: dynarray en C++14?
Draft C++14 incluye matrices de tamaño runtime 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 (e. g., 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 los arrays de tamaño runtime son parte del lenguaje core, mientras que std::dynarray
es parte de la biblioteca estándar, pero la propuesta para std::dynarray
deja claro que los autores esperan compiladores, en muchos casos, ofrecer soporte especial para std::dynarray
para que pueda ser lo más eficiente posible, es decir, tan eficiente como una matriz de tamaño de tiempo de ejecución. Como tal, la distinción lenguaje/biblioteca parece algo artificial.
Entonces, nuevamente, ¿por qué C++14 necesita tanto matrices de tamaño de tiempo de ejecución como std::dynarray
? Y dado que std::dynarray
tiene una interfaz más rica (STLified), ¿por qué no simplemente soltar matrices de tamaño de tiempo de ejecución, suponiendo que std::dynarray
se puede implementar con el mismo tiempo de ejecución ¿eficiencia?
Aclaración
Cuando hablo de "arrays de tamaño de tiempo de ejecución", me refiero a una nueva caracterÃstica del lenguaje central de C++14 que se describe en N3639, no a los arrays tradicionales de C o VLAs ni nada en C++11.
3 answers
N3639 propone agregar matrices locales del tamaño de tiempo de ejecución con duración de almacenamiento automático a C++.
N2648 dice que de acuerdo con la práctica de C++, std::dynarray
s son utilizables con más que solo variables automáticas. Pero para aprovechar la asignación de la pila de eficiencia, queremos hacer dynarray
optimizable cuando se usa como una variable automática.
En resumen, los arrays de tamaño de tiempo de ejecución de estilo C11 están restringidos a ser almacenados en la pila. dynarray
no lo es, pero se puede optimizar cuando almacenado en la pila para ser tan eficiente como las matrices de tamaño de tiempo de ejecución de estilo C11 (o asà es el objetivo).
Los arrays de tamaño de tiempo de ejecución de estilo C11 pueden ser una sintaxis útil todavÃa, y el costo para aumentar la intercompilabilidad con C no es alto: el mecanismo tendrÃa que implementarse para un dynarray
automático eficiente de todos modos. Además, los arrays de tamaño de tiempo de ejecución de estilo C11 son ciudadanos de primera clase, y existen independientemente del uso de las bibliotecas std
por el programador.
Hay diferencias importantes entre matrices reales de tamaño de ejecución C11 y matrices de tamaño de ejecución de estilo C11 de C++1y, entre las cuales no es el menor tiempo de ejecución sizeof
que admiten las matrices reales de tamaño de ejecución C11. Pero su uso básico puede ser compatible.
Tenga en cuenta que al final, ni se agregaron en C++14.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-08 19:06:02
Creo que respondiste la pregunta tú mismo, std::dynarray
tiene la interfaz stl. Un objetivo de c++11 y asumo 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 los arrays de estilo c puede encontrarse con problemas aritméticos de puntero, pero dynarray
evita los problemas si se usa según lo previsto
EDITAR: por lo que parece que una diferencia es que los arrays del tamaño de tiempo de ejecución deben asignarse a la pila, lo que aumenta la probabilidad de un desbordamiento de pila. dynarray
se asigna en el montón aunque es posible asignar en la pila (si la implementación lo hizo)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-27 22:20:51
Como usted mismo ha dicho std::dynarray
proporcionará una interfaz de estilo STL, lo que hace que sea más idiomático de usar. Aún asÃ, C++ necesita arrays dinámicos creados con new[]
para:
- al menos implementar
std::dynarray
(por lo que no puede tener dynarray sin nuevo []) - mantener la compatibilidad con versiones anteriores
No se puede decir simplemente que todo el código, que utiliza nuevo[] es ahora incorrecto.
En general, la diferencia entre C++14 std::dynarray
y C++ new[]
array es casi la misma que diferencia entre C++11 std::array
y matrices de estilo C.
UPD: Ahora veo que ahora estás preguntando acerca de la caracterÃstica similar a C11 (VLA's). En realidad no hay nada que ver con esto-los VLA son muy limitados y solo puede usar un argumento de la función como tamaño de su matriz. Además, la memoria se asigna en la pila, pero para std::dynarray
la memoria se asigna en el montón. Básicamente, esta caracterÃstica solo extiende las matrices de estilo C un poco más y hace que C++ sea un poco más compatible con el estándar moderno de C.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-21 16:59:13