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
paraspan
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 plantillaValueType
, 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 unspan<const T>
, y el acceso a datos mutables utilizaría unspan<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 comoarray_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 (comostd::vector
ostd::array
).
En
CppCoreGuidlines
El
CppCoreGuidlines
original fue renombrado para
span
.
Ver: https://github.com/isocpp/CppCoreGuidelines/pull/377
Se describe así:
span es una alternativa segura de verificación de límites al uso de punteros para acceder a las matrices
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
.