Quelle est la différence entre span et array_view dans la bibliothèque gsl?

94

Dans plusieurs conférences récentes, j'ai entendu Bjarne Stroustrup et d'autres mentionner de nouvelles directives de codage pour C ++ et certains types les prenant en charge.

Plus précisément, je me souviens de l'exemple de span<T>au lieu de en (T* p, int n)tant que paramètre d'une fonction (à environ 32h00 dans la discussion); mais je me souviens aussi de la suggestion à utiliser array_view<T>. S'agit-il de deux alternatives mais du même concept? Ou est-ce que je dérange les choses et qu'elles ne sont pas vraiment liées?

Je n'arrive pas à trouver une définition faisant autorité de ce qu'ils sont tous les deux censés être.

einpoklum
la source
@DavidHaim: voir edit, ainsi qu'ici par exemple.
einpoklum
Il existe des implémentations et des propositions de vue de tableau dans la nature. Les avez-vous regardés?
Yakk - Adam Nevraumont
1
Je crois que cela a array_viewété renommé span.
Galik
@Galik: Pouvez-vous fournir des preuves? Si vous le pouvez, écrivez-le comme réponse et j'accepterai ...
einpoklum
@Yakk: Eh bien, oui, un peu, mais il me semble voir des choses qui ne sont pas nécessairement liées, comme une partie de Microsoft C ++ AMP, etc. J'ai pensé qu'il pourrait y avoir plus d'une chose nommée array_viewflottant.
einpoklum

Réponses:

188

Nous avons discuté avec des membres du groupe de travail des bibliothèques du comité des normes . Ils voulaient que ce array_viewqu'ils essayent d'entrer dans la norme soit en lecture seule. Pour les directives de base, nous avions besoin d'une abstraction en lecture et en écriture. Pour éviter un conflit entre les normes (potentielles) et la bibliothèque de support des directives (GSL), nous avons renommé notre (lecture et écriture) array_viewen span: https://github.com/microsoft/gsl .

Bjarne Stroustrup
la source
41
Et le const array_view<T>plus array view<const T>n'était pas satisfaisant?
einpoklum
Merci de votre engagement envers le mantra des abstractions à coût nul - je pense vraiment que cela spanéviterait à beaucoup de programmeurs de faire des erreurs stupides. Je pense que la communication de ces nouveaux changements pourrait se faire de manière plus claire. Je me demande juste - ne serait-ce pas quelque chose qui pourrait être résolu aussi clairement avec un itérateur à accès aléatoire régulier? Le type a-t-il été ajouté uniquement pour plus de clarté?
Benjamin Gruenbaum
6
C'était une conférence sur les ressources et les pointeurs suspendus. span et le GSL était un problème secondaire. Jetez un œil à la conférence CppCon 2015 de Neil MacIntosh: «Evolving array_view and string_view for safe C ++ code» youtube.com/watch?v=C4Z3c4Sv52U et / ou jetez un œil à la source GSL: github.com/microsoft/gsl . Nous sommes travaille également sur une spécification formelle (style standard).
Bjarne Stroustrup
5
Il y avait un souci que "vue" impliquait simplement de regarder le contenu, pas de le modifier, donc certaines personnes voulaient un suffixe différent pour la version lecture / écriture. Je ne pense pas que quiconque se soucie beaucoup d'un type array_view en lecture seule existant. C'est string_view que les gens se soucient d'être en lecture seule par défaut.
Jeffrey Yasskin
En tant que codeur graphique où `` vue '' signifie simplement la vue actuelle de ses données en lecture / écriture (par exemple, glViewPort, SetViewport de D3D), rendre "vue" en lecture seule est surprenant, mais en dehors des graphiques, je suppose que je pourrais voir la `` vue '' se sentir plus comme une fenêtre en lecture seule qu'une fenêtre en lecture / écriture.
Dwayne Robinson le
45

Dans les CppCoreGuidlines L'original a array_viewété renommé span.

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

Il est décrit ainsi:

span est une alternative sûre et vérifiée par les limites à l'utilisation de pointeurs pour accéder aux tableaux

Galik
la source
2
Je vous ai attribué +1, mais la réponse de Bjarne Stroustrup (vraiment?) Est plus détaillée.
einpoklum
30
@einpoklum Non, je comprends. J'aurais probablement choisi Bjarne Stroustrup plutôt que moi. Ne pas (renifler) prendre (renifler) ça (renifler) personnel (wahhhhhh) ...
Galik
1
Ce commentaire m'a fait ressentir quelque chose à l'intérieur, donc +1 de moi aussi ;-)
YePhIcK
11

Le document P0122R (2016-02-12) du Library Evolution Working Group (LEWG)
renomme officiellement le type array_viewenspan :

Changelog

Changements depuis R0

  • Changement du nom du type proposé de array_viewen spansuivant les commentaires du LEWG à la réunion de Kona.
  • [...]

On peut également lire:

Impact sur la norme

Cette proposition est une pure extension de bibliothèque. Il ne nécessite aucune modification des classes, fonctions ou en-têtes standard. Il serait amélioré si cela pouvait dépendre du bytetype et des changements de comportement d'alias de type proposés dans P0257 .

Cependant, s'il est adopté, il peut être utile de surcharger certaines fonctions de bibliothèque standard pour ce nouveau type (un exemple serait copy()).

spana été implémenté en C ++ standard (C ++ 11) et est utilisé avec succès dans un outil commercial d'analyse statique pour le code C ++ ainsi que dans un logiciel de productivité de bureau commercial. Une implémentation de référence open source est disponible à l' adresse https://github.com/Microsoft/GSL .

Dans un chapitre suivant, ce document présente les accès en lecture seule et en lecture-écriture ( mutable ):

Types d'élément et conversions

spandoit être configuré avec son type d'élément via le paramètre template ValueType, qui doit être un type d'objet complet qui n'est pas un type de classe abstraite. spanprend en charge l'accès en lecture seule ou modifiable à la séquence qu'il encapsule. Pour accéder aux données en lecture seule, l'utilisateur peut déclarer a span<const T>, et l'accès aux données mutables utiliserait un span<T>.

[...]


Voir aussi le Guidelines Support Library Review:span<T> de Marius Bancila (mars 2016) définissant spancomme:

La bibliothèque de prise en charge des lignes directrices est une implémentation Microsoft de certains des types et fonctions décrits dans les lignes directrices de base C ++ maintenues par la Standard C ++ Foundation . Parmi les types fournis par le GSL est span<T>anciennement connu sous le nom de array_view<T>.

span<T>est une plage non propriétaire de mémoire contiguë dont l'utilisation est recommandée à la place des pointeurs (et compteur de taille) ou des conteneurs standard (tels que std::vectorou std::array).

olibre
la source