Quelle est la différence entre la vue span et le tableau dans la bibliothèque gsl?

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

en particulier, je me souviens de l'exemple de span<T> au lieu de (T* p, int n) comme paramètre à une fonction (au temps environ 32:00 dans la discussion); mais je me souviens aussi de la suggestion d'utiliser array_view<T> . Sont - ils deux alternatives mais le même concept? Ou je confonds les choses et ils ne sont pas vraiment de sorte liés?

Je n'arrive pas à trouver de définition officielle de ce qu'ils sont censés être.

76
demandé sur einpoklum 2016-01-17 00:01:39

3 réponses

nous avons parlé avec des gens dans le groupe de travail de la bibliothèque dans le Comité des normes . Ils voulaient que le array_view ils essayent d'entrer dans la norme pour être lu seulement. Pour les lignes directrices de base, nous avions besoin d'une abstraction qui se lisait et s'écrivait. Pour éviter un conflit entre les normes (potentielles) et la bibliothèque de support des lignes directrices (GSL), nous avons renommé notre (lire et écrire) array_view en span : https://github.com/microsoft/gsl .

159
répondu Bjarne Stroustrup 2016-01-16 23:48:05

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

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

il est décrit ainsi:

span " est une des limites-vérifié, alternative sûre à l'aide de pointeurs pour accéder à des tableaux

39
répondu Galik 2016-01-16 21:57:02

the document P0122R (2016-02-12) from the Library Evolution Working Group (LEWG)

renomme officiellement le type array_view en span :

Changelog

modifie de R0

  • a changé le nom du type proposé de array_view à span suite aux commentaires de LEWG à la réunion de Kona.
  • [...]

on peut aussi lire:

Impact sur le niveau

Cette proposition est une pure extension de bibliothèque. Il n'est pas nécessaire de modifier les classes, les fonctions ou les en-têtes standard. Il serait amélioré si pourrait Dépend du type byte et modifications du comportement d'aliasing de type proposé dans P0257 .

cependant - si adopté – il peut être utile de surcharger certaines fonctions de bibliothèque standard pour ce nouveau type (un exemple serait copy() ).

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

dans un chapitre suivant, ce document présente le en lecture seule et en lecture seule ( mutable ) accès:

types D'éléments et conversions

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

[...]


Voir Aussi Le lignes directrices Revue de la bibliothèque: span<T> de Marius Bancila (mars 2016) définissant span comme:

le bibliothèque de soutien de lignes directrices est une mise en œuvre de Microsoft de certains des types et fonctions décrits dans les C++ Core Guidelines maintenu par la Standard C++ Foundation . Parmi les types fournis par la GSL est span<T> anciennement connu sous le nom de array_view<T> .

span<T> est une gamme Non propriétaire de mémoire contiguë qu'il est recommandé d'utiliser au lieu de pointeurs (et compteur de taille) ou conteneurs standard (tels que std::vector ou std::array ).

11
répondu olibre 2016-03-24 18:45:26