web-dev-qa-db-fra.com

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

Dans plusieurs présentations récentes à la conférence, Bjarne Stroustrup et d’autres ont mentionné 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 (T* p, int n) en tant que paramètre d'une fonction (vers 32h00 environ dans la conversation); mais je me souviens aussi de la suggestion d'utiliser array_view<T>. Sont-ils deux alternatives mais le même concept? Ou suis-je en train de confondre les choses et elles ne sont en fait pas si liées?

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

82
einpoklum

Nous avons parlé avec des personnes du groupe de travail sur les bibliothèques du comité des normes . Ils voulaient le array_view ils essaient d'entrer dans la norme pour être en lecture seule. Pour les directives de base, nous avions besoin d’une abstraction lue et écrite. Pour éviter un conflit entre les normes (potentielles) et la bibliothèque de support de lignes directrices (GSL), nous avons renommé notre (lecture et écriture) array_view à span: https://github.com/Microsoft/gsl .

168
Bjarne Stroustrup

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

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

Il est décrit ainsi:

span est une alternative sûre et sécurisée à l'utilisation de pointeurs pour accéder aux tableaux

42
Galik

Le document P0122R (2016-02-12) du groupe de travail sur l'évolution de la bibliothèque (LEWG)
renomme officiellement le type array_view en span:

Changelog

Changements depuis R0

  • Le nom du type proposé de array_view A été remplacé par span à la suite des commentaires du LEWG lors de la réunion de Kona.
  • [...]

On peut aussi lire:

Impact sur la norme

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

Cependant, si elle est adoptée, il peut être utile de surcharger certaines fonctions de bibliothèque standard pour ce nouveau type (par exemple, copy()).

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

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

Types d'élément et conversions

span doit être configuré avec son type d'élément via le paramètre de modèle ValueType, qui doit être un type d'objet complet qui n'est pas un type de classe abstrait. span prend en charge l'accès en lecture seule ou 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 Remarques sur la bibliothèque de support: span<T> de Marius Bancila (mars 2016) définissant span comme :

Guidelines Support Library est une implémentation Microsoft de certains des types et fonctions décrits dans les Directives C++ Core conservées par le Standard C++ Foundation . Parmi les types fournis par le GSL, il y a span<T>, Anciennement appelé array_view<T>.

span<T> Est une plage non propriétaire de mémoire contiguë recommandée pour être utilisée à la place des pointeurs (et compteur de taille) ou des conteneurs standard (tels que std::vector Ou std::array).

11
olibre