Pregunta ¿Cuál es la diferencia entre span y array_view en la biblioteca gsl?


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

Específicamente, recuerdo el ejemplo de span<T> en lugar de (T* p, int n) como un parámetro para una función (a las 32:00 aproximadamente en la charla); 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 una definición autorizada de lo que se supone que son ambos.


75
2018-01-16 21:01


origen


Respuestas:


Hablamos con personas en el grupo de trabajo de la biblioteca en el comité de normas. Ellos querían el array_view están tratando de entrar en el estándar para ser de solo lectura. Para las directrices 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), hemos cambiado el nombre de nuestro (leer y escribir) array_view a span: https://github.com/microsoft/gsl .


155
2018-01-16 22:26



En el CppCoreGuidlines El original array_view fue renombrado a span.

Ver: https://github.com/isocpp/CppCoreGuidelines/pull/377

Se describe así:

span es una alternativa segura y comprobada en límites al uso de punteros para acceder a matrices


37
2018-01-16 21:57



El documento P0122R (2016-02-12) del Grupo de trabajo de evolución de la biblioteca (LEWG)
oficialmente cambia el nombre del tipo array_view a span:

Registro de cambios

Cambios desde R0

  • Cambió el nombre del tipo que se propone de array_view a span siguiendo los 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 depende de la byte tipo   y cambios al tipo de comportamiento de alias 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á implementando con éxito   utilizado 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 fuente abierta está disponible en https://github.com/Microsoft/GSL.

En un próximo capítulo, este documento presenta la solo lectura y leer escribir (mudable) accesos:

Tipos de elementos y conversiones

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

[...]


Ver también el Revisión de la biblioteca de soporte de guías: span<T> de Marius Bancila (marzo de 2016) definiendo span como:

los Biblioteca de soporte de directrices es una implementación de Microsoft   de algunos de los tipos y funciones descritos en Directrices centrales de C ++    mantenido por el Fundación estándar C ++.   Entre los tipos proporcionados por GSL es span<T> anteriormente conocido como array_view<T>.

span<T> es un rango no propietario de memoria contigua recomendado para ser utilizado en lugar de   punteros (y contador de tamaño) o contenedores estándar (como std::vector o std::array)


11
2018-03-24 18:45