c++ cpp-core-guidelines guideline-support-library array-view

c++ - ¿Cuál es la diferencia entre span y array_view en la biblioteca gsl?



cpp-core-guidelines guideline-support-library (3)

En varias presentaciones recientes de la conferencia, escuché a Bjarne Stroustrup y otros mencionar nuevas pautas de codificación para C ++ y algunos tipos que las apoyan.

Específicamente, recuerdo el ejemplo de span<T> lugar de (T* p, int n) como parámetro de una función (en el momento aproximadamente 32:00 en la conversación); pero también recuerdo la sugerencia de usar array_view<T> . ¿Son dos alternativas pero el mismo concepto? ¿O estoy confundiendo cosas y en realidad no están tan relacionadas?

Parece que no puedo encontrar ninguna definición autorizada de lo que se supone que deben ser.


El documento P0122R (2016-02-12) del Library Evolution Working Group (LEWG)
renombra oficialmente el tipo array_view para span :

Registro de cambios

Cambios desde R0

  • Cambió el nombre del tipo que se propone de array_view para span siguientes comentarios de LEWG en la reunión de Kona.
  • [...]

También podemos leer:

Impacto en el estándar

Esta propuesta es una extensión de biblioteca pura. No requiere ningún cambio en las clases, funciones o encabezados estándar. Sería mejorado si pudiera depender del tipo de byte y los cambios en el comportamiento de alias de tipo propuesto en P0257 .

Sin embargo, si se adopta, puede ser útil sobrecargar algunas funciones de biblioteca estándar para este nuevo tipo (un ejemplo sería copy() ).

span se ha implementado en C ++ estándar (C ++ 11) y se está utilizando con éxito dentro de una herramienta comercial de análisis estático para código C ++, así como software de productividad de oficina comercial. Una implementación de referencia de código abierto está disponible en https://github.com/Microsoft/GSL .

En un próximo capítulo, este documento presenta los accesos de solo lectura y lectura-escritura ( mutable ):

Tipos de elementos y conversiones

span debe configurarse con su tipo de elemento a través del parámetro de plantilla ValueType , que se requiere para ser un tipo de objeto completo que no sea un tipo de clase abstracta. span admite acceso de solo lectura o mutable a la secuencia que encapsula. Para acceder a datos de solo lectura, el usuario puede declarar un span<const T> , y el acceso a datos mutables utilizaría un span<T> .

[...]

Consulte también la Revisión de la biblioteca de soporte de pautas: span<T> de Marius Bancila (marzo de 2016) que define span como:

La https://github.com/Microsoft/GSL es una implementación de Microsoft de algunos de los tipos y funciones descritos en las Directrices principales de C ++ mantenidas por la Fundación Standard C ++ . Entre los tipos proporcionados por GSL se encuentra span<T> anteriormente conocido como array_view<T> .

span<T> es un rango no propietario de memoria contigua que se recomienda utilizar en lugar de punteros (y contador de tamaño) o contenedores estándar (como std::vector o std::array ).



Hablamos con personas del grupo de trabajo de la biblioteca en el comité de normas . Querían que el array_view que intentan introducir en el estándar sea de solo lectura. Para las pautas básicas, necesitábamos una abstracción que fuera de lectura y escritura. Para evitar un choque entre los estándares (potenciales) y la biblioteca de soporte de guías (GSL), cambiamos el nombre de nuestra (lectura y escritura) array_view para span : https://github.com/microsoft/gsl .