Der Zweck aller Arten von Vorschlägen für "Zeichenfolgenreferenz" und "Arrayreferenz" besteht darin, das Kopieren von Daten zu vermeiden, die sich bereits an einem anderen Ort befinden und für die nur eine nicht mutierende Ansicht erforderlich ist. Das string_view
fragliche ist ein solcher Vorschlag; es wurden frühere genannt string_ref
undarray_ref
auch.
Die Idee ist immer, ein Paar von Zeiger auf das erste Element und die Größe eines vorhandenen Datenarrays oder einer vorhandenen Zeichenfolge zu speichern .
Eine solche View-Handle-Klasse könnte billig nach Wert weitergegeben werden und würde billige Teilzeichenfolgenoperationen bieten (die als einfache Zeigerinkremente und Größenanpassungen implementiert werden können).
Viele Verwendungen von Zeichenfolgen erfordern keinen tatsächlichen Besitz der Zeichenfolgen, und die betreffende Zeichenfolge gehört häufig bereits jemand anderem. 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 Null-Terminator Teil der Zeichenfolgen-APIs war, sodass Sie keine einfachen Teilzeichenfolgen erstellen konnten, ohne die zugrunde liegende Zeichenfolge zu mutieren (a la) strtok
). In C ++ kann dies leicht gelöst werden, indem die Länge separat gespeichert und der Zeiger und die Größe in eine Klasse eingeschlossen werden.
Das einzige Haupthindernis und die Abweichung von der Philosophie der C ++ - Standardbibliothek, die ich mir vorstellen kann, besteht darin, dass solche Klassen mit "referenzieller Ansicht" eine völlig andere Besitzersemantik aufweisen als der Rest der Standardbibliothek. Grundsätzlich ist alles andere in der Standardbibliothek unbedingt sicher und korrekt (wenn es kompiliert wird, ist es korrekt). Mit solchen Referenzklassen stimmt das nicht mehr. Die Richtigkeit Ihres Programms hängt vom Umgebungscode ab, der diese Klassen verwendet. Das ist also schwieriger zu überprüfen und zu lehren.