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.
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 .
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
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 templateValueType
, 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 unspan<const T>
, et l'accès aux données mutables utiliserait unspan<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 dearray_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 questd::vector
oustd::array
).