webentwicklung-frage-antwort-db.com.de

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

In einigen Konferenzvorträgen habe ich Bjarne Stroustrup und andere gehört, die neue Codierungsrichtlinien für C++ und einige Typen, die sie unterstützen, erwähnt haben.

Konkret erinnere ich mich an das Beispiel von span<T> Anstelle von (T* p, int n) Als Parameter für eine Funktion (um etwa 32:00 Uhr im Gespräch); Ich erinnere mich aber auch an den Vorschlag, array_view<T> zu verwenden. Sind das zwei Alternativen, aber dasselbe Konzept? Oder bin ich verwirrend und sie sind eigentlich nicht so verwandt?

Ich kann anscheinend keine verbindliche Definition dessen finden, worum es bei beiden gehen soll.

82
einpoklum

Wir haben mit Leuten in der Bibliotheksarbeitsgruppe im Normungsausschuss gesprochen. Sie wollten, dass der array_view, Den sie versuchen, in den Standard zu gelangen, nur gelesen werden kann. Für die Kernrichtlinien benötigten wir eine Abstraktion, die gelesen und geschrieben wurde. Um einen Konflikt zwischen den (potenziellen) Standards und der GSL (Guidelines Support Library) zu vermeiden, haben wir unser array_view In span: https: // github umbenannt .com/Microsoft/gsl .

168

In den CppCoreGuidlines Das ursprüngliche array_view wurde in span umbenannt.

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

Es ist so beschrieben:

span ist eine beschränkungsüberprüfte, sichere Alternative zur Verwendung von Zeigern für den Zugriff auf Arrays

42
Galik

Das Dokument P0122R (2016-02-12) von der Library Evolution Working Group (LEWG)
benennt den Typ array_view offiziell in span um:

Änderungsprotokoll

Änderungen von R0

  • Der Name des vorgeschlagenen Typs wurde von array_view In span geändert, nachdem die LEWG auf dem Kona-Treffen eine Rückmeldung gegeben hatte.
  • [...]

Wir können auch lesen:

Auswirkungen auf den Standard

Dieser Vorschlag ist eine reine Bibliothekserweiterung. Es sind keine Änderungen an Standardklassen, Funktionen oder Kopfzeilen erforderlich. Es würde verbessert, wenn dies vom Typ byte und von Änderungen des in P0257 vorgeschlagenen Typ-Aliasing-Verhaltens abhängen könnte.

Wenn es jedoch übernommen wird, kann es nützlich sein, einige Standardbibliotheksfunktionen für diesen neuen Typ zu überladen (ein Beispiel wäre copy()).

span wurde in Standard-C++ (C++ 11) implementiert und wird erfolgreich in einem kommerziellen statischen Analysetool für C++ - Code sowie in kommerzieller Office-Produktivitätssoftware verwendet. Eine Open Source-Referenzimplementierung finden Sie unter https://github.com/Microsoft/GSL .

In einem nächsten Kapitel werden in diesem Dokument die Zugriffe read-only und read-write ( mutable) vorgestellt:

Elementtypen und Konvertierungen

span muss mit seinem Elementtyp über den Vorlagenparameter ValueType konfiguriert werden, der ein vollständiger Objekttyp sein muss, der kein abstrakter Klassentyp ist. span unterstützt entweder den schreibgeschützten oder den veränderlichen Zugriff auf die gekapselte Sequenz. Um auf schreibgeschützte Daten zuzugreifen, kann der Benutzer einen span<const T> Deklarieren, und für den Zugriff auf veränderbare Daten würde ein span<T> Verwendet.

[...]


Siehe auch die Guidelines Support Library Review: span<T> von Marius Bancila (März 2016), die span definiert als:

Die Guidelines Support Library ist eine Microsoft-Implementierung einiger der in den C++ Core Guidelines beschriebenen Typen und Funktionen, die von der Standard C++ Foundation verwaltet werden. Zu den von der GSL bereitgestellten Typen gehört span<T>, Früher bekannt als array_view<T>.

span<T> Ist ein nicht im Besitz von zusammenhängendem Speicher, der anstelle von Zeigern (und Größenzählern) oder Standardcontainern (wie std::vector Oder std::array) Verwendet werden sollte.

11
olibre