Frage Was ist der Unterschied zwischen span und array_view in der GSL-Bibliothek?


In einigen kürzlich erschienenen Konferenzpräsentationen habe ich gehört, dass Bjarne Stroustrup und andere neue Codierungsrichtlinien für C ++ und einige Typen, die sie unterstützen, erwähnen.

Insbesondere erinnere ich mich das Beispiel von span<T> Anstatt von (T* p, int n) als Parameter für eine Funktion (um ca. 32:00 in das Gespräch); aber ich erinnere mich auch an den Vorschlag zu verwenden array_view<T>. Sind das zwei Alternativen, aber das gleiche Konzept? Oder verwirre ich Dinge und sie sind eigentlich nicht so verwandt?

Ich kann anscheinend keine autoritative Definition dessen finden, worüber sie beide sein sollen.


75
2018-01-16 21:01


Ursprung


Antworten:


Wir haben mit Leuten in der Bibliotheksarbeitsgruppe in dem Normenausschuss. Sie wollten das array_view Sie versuchen, in den Standard zu gelangen, um nur gelesen zu werden. Für die Kernrichtlinien benötigten wir eine Abstraktion, die gelesen und geschrieben wurde. Um eine Kollision zwischen den (potenziellen) Standards und der Guidelines Support Library (GSL) zu vermeiden, haben wir diese umbenannt (lesen und schreiben) array_view zu span: https://github.com/microsoft/gsl .


155
2018-01-16 22:26



In dem CppCoreGuidlines Das Original array_view wurde umbenannt in span.

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

Es wird so beschrieben:

span ist eine über Grenzen kontrollierte, sichere Alternative zur Verwendung von Zeigern zum Zugriff auf Arrays


37
2018-01-16 21:57



Das Dokument P0122R (2016-02-12) von der Bibliotheksentwicklungs-Arbeitsgruppe (LEWG)
offiziell den Typ umbenennen array_view zu span:

Änderungsprotokoll

Änderungen von R0

  • Der Name des vorgeschlagenen Typs wurde geändert array_view zu span nach Rückmeldung von LEWG beim Kona-Treffen.
  • [...]

Wir können auch lesen:

Auswirkungen auf den Standard

Dieser Vorschlag ist eine reine Bibliothekserweiterung.   Es erfordert keine Änderungen an Standardklassen, Funktionen oder Headern.   Es würde verbessert werden, wenn das von der abhängt byte Art   und Änderungen am Typ Aliasing-Verhalten vorgeschlagen in P0257.

Es kann jedoch - falls übernommen - nützlich sein, einige Standardbibliotheksfunktionen für diesen neuen Typ zu überladen (ein Beispiel wäre dies) copy()).

span wurde in Standard C ++ (C ++ 11) implementiert und wird erfolgreich ausgeführt   Verwendung in einem kommerziellen statischen Analysetool für C ++ - Code sowie für kommerzielle Office-Produktivitätssoftware.   Eine Open-Source-Referenzimplementierung ist verfügbar unter https://github.com/Microsoft/GSL.

In einem nächsten Kapitel stellt dieses Dokument die schreibgeschützt und lesen Schreiben (veränderlich) Zugriffe:

Elementtypen und -konvertierungen

span muss mit seinem Elementtyp konfiguriert werden   über den Vorlagenparameter ValueType,   Dies muss ein vollständiger Objekttyp sein   das ist kein abstrakter Klassentyp.    span unterstützt entweder schreibgeschützten oder veränderbaren Zugriff auf die Sequenz, die es einkapselt.   Um auf schreibgeschützte Daten zuzugreifen, kann der Benutzer Folgendes angeben: a span<const T>,   und der Zugriff auf veränderbare Daten würde einen verwenden span<T>.

[...]


Siehe auch die Richtlinien unterstützen Bibliotheksüberprüfung: span<T> von Marius Bancila (März 2016) definiert span wie:

Das Richtlinien-Support-Bibliothek ist eine Microsoft-Implementierung   von einigen der Arten und Funktionen beschrieben in der C ++ - Kernrichtlinien    gepflegt von der Standard C ++ Foundation.   Unter den von der GSL zur Verfügung gestellten Typen ist span<T> früher bekannt als array_view<T>.

span<T> ist ein nicht-besitzender Bereich von zusammenhängenden Speicher, der empfohlen wird, anstelle von verwendet zu werden   Zeiger (und Größenzähler) oder Standardcontainer (wie z std::vector oder std::array).


11
2018-03-24 18:45