web-dev-qa-db-de.com

Was ist string_view?

string_view war eine vorgeschlagene Funktion innerhalb der C++ Library Fundamentals TS ( N3921 ), die zu C++ 17 hinzugefügt wurde

Soweit ich verstehe, handelt es sich um einen Typ, der eine Art Zeichenfolge "Konzept" darstellt, dh eine Ansicht eines beliebigen Containertyps, in dem etwas gespeichert werden kann, das als Zeichenfolge angezeigt werden kann.

  • Ist das richtig ?
  • Sollte der kanonische const std::string& Parametertyp wird string_view?
  • Gibt es einen weiteren wichtigen Punkt bei string_view in Erwägung ziehen ?
135
Drax

Der Zweck aller Arten von "String-Referenz" - und "Array-Referenz" -Vorschlägen besteht darin, das Kopieren von Daten zu vermeiden, die sich bereits in einem anderen Besitz befinden und für die nur eine nicht mutierende Ansicht erforderlich ist. Das string_view in Frage kommt ein solcher Vorschlag; es gab frühere mit dem Namen string_ref und array_ref, auch.

Die Idee ist immer, ein Paar Zeiger auf das erste Element und die Größe eines vorhandenen Datenarrays oder einer Zeichenfolge zu speichern.

Eine solche View-Handle-Klasse kann kostengünstig nach Wert weitergegeben werden und bietet kostengünstige Teilzeichenfolgenoperationen (die als einfache Zeigerinkremente und Größenanpassungen implementiert werden können).

Bei vielen Verwendungen von Zeichenfolgen ist es nicht erforderlich, die Zeichenfolgen tatsächlich zu besitzen, und die betreffende Zeichenfolge ist häufig bereits im Besitz einer anderen Person. Es besteht also ein echtes Potenzial zur Steigerung der Effizienz, indem nicht benötigte Kopien vermieden werden (denken Sie an alle Zuordnungen und Ausnahmen, die Sie speichern können).

Die ursprünglichen C-Zeichenfolgen hatten das Problem, dass der Nullterminator Teil der Zeichenfolgen-APIs war. Daher konnten Sie Teilzeichenfolgen nicht einfach erstellen, ohne die zugrunde liegende Zeichenfolge (a la strtok) zu ändern. In C++ lässt sich dies leicht lösen, indem die Länge separat gespeichert und der Zeiger und die Größe in eine Klasse eingeschlossen werden.

Das größte Hindernis und die größte Abweichung von der Philosophie der C++ - Standardbibliothek ist, dass solche Klassen mit "referentieller Sicht" eine völlig andere Besitzersemantik haben als der Rest der Standardbibliothek. Grundsätzlich ist alles andere in der Standardbibliothek unbedingt sicher und korrekt (wenn es kompiliert wird, ist es korrekt). Bei solchen Referenzklassen ist das nicht mehr der Fall. Die Richtigkeit Ihres Programms hängt vom Umgebungscode ab, der diese Klassen verwendet. Das ist schwieriger zu überprüfen und zu lehren.

158
Kerrek SB