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

94

En varias presentaciones de conferencias recientes, 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 en span<T>lugar de (T* p, int n)como parámetro de una función (a las 32:00 de la charla); pero también recuerdo la sugerencia de usar array_view<T>. ¿Son dos alternativas pero el mismo concepto? ¿O estoy confundiendo las cosas y en realidad no están tan relacionadas?

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

einpoklum
fuente
@DavidHaim: Ver editar, así como aquí, por ejemplo.
einpoklum
Hay implementaciones y propuestas de vista de matriz en la naturaleza. ¿Los has mirado?
Yakk - Adam Nevraumont
1
Creo que array_viewse le cambió el nombre a span.
Galik
@Galik: ¿Puede proporcionar pruebas? Si puede, escríbalo como respuesta y acepto ...
einpoklum
@Yakk: Bueno, sí, un poco, pero parece que veo cosas que no están necesariamente relacionadas, como parte de Microsoft C ++ AMP, etc. Pensé que podría haber más de una cosa nombrada array_viewflotando.
einpoklum

Respuestas:

188

Hablamos con la gente del grupo de trabajo de la biblioteca en el comité de normas . Querían que el array_viewque intentaban entrar en el estándar fuera de solo lectura. Para las pautas básicas, necesitábamos una abstracción que fuera de lectura y escritura. Para evitar un conflicto entre los estándares (potenciales) y la biblioteca de soporte de pautas (GSL), cambiamos el nombre de nuestro (lectura y escritura) array_viewa span: https://github.com/microsoft/gsl .

Bjarne Stroustrup
fuente
41
¿Y el const array_view<T>plus array view<const T>no fue satisfactorio?
einpoklum
Gracias por estar comprometido con el mantra de las abstracciones de costo cero. Realmente creo spanque salvaría a muchos programadores de cometer errores tontos. Sin embargo, creo que la comunicación de estos nuevos cambios podría hacerse de una manera más clara. Me pregunto: ¿no sería esto algo que podría resolverse con la misma claridad con un iterador de acceso aleatorio regular? ¿Se agregó el tipo solo para mayor claridad?
Benjamin Gruenbaum
6
Esta fue una charla sobre recursos y sugerencias pendientes. span y el GSL fue un tema secundario. Eche un vistazo a la charla CppCon 2015 de Neil MacIntosh: "La evolución de array_view y string_view para un código C ++ seguro" youtube.com/watch?v=C4Z3c4Sv52U y / o eche un vistazo a la fuente de GSL: github.com/microsoft/gsl . también trabajando en una especificación formal (estilo estándar).
Bjarne Stroustrup
5
Existía la preocupación de que "ver" implicara simplemente mirar el contenido, no modificarlo, por lo que algunas personas querían un sufijo diferente para la versión de lectura / escritura. No creo que a nadie le importe mucho que exista un tipo array_view de solo lectura. Es string_view que a las personas les importa que sea de solo lectura de forma predeterminada.
Jeffrey Yasskin
Como codificador de gráficos donde 'ver' simplemente significa la vista actual de uno en los datos de lectura / escritura (por ejemplo, glViewPort, SetViewport de D3D), hacer que "ver" sea de solo lectura es sorprendente, pero los gráficos externos, supongo que podría ver que 'ver' se siente más como una ventana de solo lectura que una ventana de lectura / escritura.
Dwayne Robinson
45

En CppCoreGuidlines,array_view se cambió el nombre del original a span.

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

Se describe así:

span es una alternativa segura y con límites comprobados al uso de punteros para acceder a las matrices

Galik
fuente
2
Te hice +1, pero la respuesta de Bjarne Stroustrup (¿en serio?) Es más detallada.
einpoklum
30
@einpoklum No, lo entiendo. Probablemente también hubiera elegido a Bjarne Stroustrup antes que a mí. No (oler) tomar (oler) lo (oler) personal (wahhhhhh) ...
Galik
1
Ese comentario me hizo sentir algo en su interior, por lo que 1 de mí, también ;-)
YePhIcK
11

El documento P0122R (2016-02-12) del Library Evolution Working Group (LEWG)
cambia oficialmente el nombre del tipo array_viewaspan :

Registro de cambios

Cambios de R0

  • Se cambió el nombre del tipo propuesto de array_view a spanseguir 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. Se mejoraría si pudiera depender del bytetipo 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() ).

spanse 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 capítulo siguiente, este documento presenta los accesos de solo lectura y lectura-escritura ( mutables ):

Tipos de elementos y conversiones

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

[...]


Consulte también la Revisión de la biblioteca de apoyo aspan<T> las directrices: de Marius Bancila (marzo de 2016) que se define spancomo:

La Biblioteca de soporte de pautas es una implementación de Microsoft de algunos de los tipos y funciones descritos en las Pautas principales de C ++ mantenidas por Standard C ++ Foundation . Entre los tipos proporcionados por GSL se span<T>conocía anteriormente como array_view<T>.

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

olibre
fuente