web-dev-qa-db-fra.com

Qu'est-ce que string_view?

string_view était une fonctionnalité proposée dans TS ++: Principes de base de la bibliothèque C++ ( N3921 ) ajoutée à C++ 17

Autant que je sache, il s'agit d'un type représentant une sorte de "concept" de chaîne, qui est une vue de tout type de conteneur pouvant stocker un élément visible en tant que chaîne.

  • Est-ce correct ?
  • Le canonique const std::string& le type de paramètre devient string_view?
  • Y at-il un autre point important à propos de string_view à prendre en compte?
135
Drax

Le but de tous les types de propositions "référence de chaîne" et "référence de tableau" est d'éviter de copier des données qui sont déjà détenues ailleurs et pour lesquelles seule une vue non mutante est requise. Le string_view en question est une de ces propositions; il y avait des précédents appelés string_ref et array_ref, aussi.

L'idée est toujours de stocker une paire de pointeur vers le premier élément et la taille de quelque existant tableau ou chaîne de données.

Une telle classe de vues peut être transmise à moindre coût en valeur et offrirait des opérations de sous-chaîne peu coûteuses (pouvant être implémentées sous forme d'incréments de pointeur et d'ajustements de taille simples).

De nombreuses utilisations de chaînes ne nécessitent pas la possession réelle des chaînes, et la chaîne en question appartiendra souvent déjà à quelqu'un d'autre. Il existe donc un réel potentiel d’augmentation de l’efficacité en évitant les copies inutiles (pensez à toutes les allocations et exceptions que vous pouvez enregistrer).

Les chaînes C d'origine souffraient du problème selon lequel le terminateur null faisait partie des API de chaîne. Il était donc impossible de créer facilement des sous-chaînes sans transformer la chaîne sous-jacente (a la strtok). En C++, cela est facilement résolu en stockant la longueur séparément et en enveloppant le pointeur et la taille dans une classe.

Le seul obstacle majeur et la divergence par rapport à la philosophie de la bibliothèque standard C++ à laquelle je peux penser est que de telles classes "de vue référentielle" ont une sémantique de propriété complètement différente du reste de la bibliothèque standard. Fondamentalement, tout le reste de la bibliothèque standard est inconditionnellement sûr et correct (si elle est compilée, elle est correcte). Avec des classes de référence comme celle-ci, ce n'est plus vrai. L'exactitude de votre programme dépend du code ambiant qui utilise ces classes. Donc, c'est plus difficile à vérifier et à enseigner.

158
Kerrek SB