¿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.

Author: Vadim Kotov, 2013-06-28

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.

 31
Author: Yakk - Adam Nevraumont,
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)

 2
Author: aaronman,
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:

  1. al menos implementar std::dynarray (por lo que no puede tener dynarray sin nuevo [])
  2. 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.

 2
Author: sasha.sochka,
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