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


92

In mehreren kürzlich gehaltenen Konferenzpräsentationen habe ich gehört, dass Bjarne Stroustrup und andere neue Codierungsrichtlinien für C ++ und einige Typen, die diese unterstützen, erwähnt haben.

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

Ich kann anscheinend keine maßgebliche Definition dafür finden, worum es bei beiden gehen soll.


@DavidHaim: Siehe Bearbeiten sowie hier zum Beispiel.
Einpoklum

Es gibt Implementierungen und Vorschläge für Array-Ansichten in freier Wildbahn. Hast du sie angeschaut?
Yakk - Adam Nevraumont

1
Ich glaube das array_viewwurde umbenannt in span.
Galik

@ Galik: Können Sie Beweise liefern? Wenn Sie können, schreiben Sie es als Antwort und ich werde akzeptieren ...
einpoklum

@Yakk: Nun ja, ein bisschen, aber ich scheine Dinge zu sehen, die nicht unbedingt miteinander zusammenhängen, wie ein Teil von Microsoft C ++ AMP usw. Ich dachte, es könnte mehr als eine Sache geben, die array_viewherumschwebt.
Einpoklum

Antworten:


185

Wir haben mit Leuten aus der Bibliotheksarbeitsgruppe im Normungsausschuss gesprochen . Sie wollten, dass das, was array_viewsie versuchen, in den Standard zu gelangen, schreibgeschützt ist. Für die Kernrichtlinien brauchten wir eine Abstraktion, die gelesen und geschrieben wurde. Um einen Zusammenstoß zwischen den (potentiellen) Normen zu vermeiden und den Richtlinien unterstützen Bibliothek (GSL), wir umbenannt unsere (lesen und schreiben) array_viewauf span: https://github.com/microsoft/gsl .


41
Und const array_view<T>plus array view<const T>war nicht zufriedenstellend?
Einpoklum

Vielen Dank, dass Sie sich dem Mantra der Null-Kosten-Abstraktionen verschrieben haben. Ich glaube wirklich, dass spandies viele Programmierer vor dummen Fehlern bewahren würde. Ich denke, die Kommunikation dieser neuen Änderungen könnte jedoch klarer erfolgen. Ich frage mich nur - wäre dies nicht etwas, das mit einem regulären Iterator mit wahlfreiem Zugriff so klar gelöst werden könnte? Wurde der Typ nur aus Gründen der Übersichtlichkeit hinzugefügt?
Benjamin Gruenbaum

6
Dies war ein Vortrag über Ressourcen und baumelnde Zeiger. span und die GSL war ein Nebenproblem. Schauen Sie sich Neil MacIntoshs CppCon 2015-Vortrag an: „Weiterentwicklung von array_view und string_view für sicheren C ++ - Code“ youtube.com/watch?v=C4Z3c4Sv52U und / oder haben einen Blick auf die GSL Quelle: github.com/microsoft/gsl . Wir sind arbeitet auch an einer formalen (Standardstil) Spezifikation.
Bjarne Stroustrup

5
Es gab eine Sorge, dass "Ansicht" implizierte, nur den Inhalt zu betrachten und nicht zu ändern, so dass einige Leute ein anderes Suffix für die Lese- / Schreibversion wollten. Ich glaube, niemand kümmert sich viel um einen schreibgeschützten Array_view-Typ. Es ist string_view, dass die Leute standardmäßig schreibgeschützt sind.
Jeffrey Yasskin

Als Grafikcodierer, bei dem "Ansicht" lediglich die aktuelle Ansicht in Lese- / Schreibdaten bedeutet (z. B. glViewPort, D3Ds SetViewport), ist es überraschend, "Ansicht" schreibgeschützt zu machen, aber außerhalb von Grafiken könnte ich sehen, dass sich "Ansicht" mehr anfühlt wie ein schreibgeschütztes Fenster als ein Lese- / Schreibfenster.
Dwayne Robinson

44

In den CppCoreGuidlines Das Original array_viewwurde in umbenanntspan .

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

Es wird folgendermaßen beschrieben:

span ist eine sichere Alternative zur Verwendung von Zeigern für den Zugriff auf Arrays


2
Ich habe Sie gebeten, aber die Antwort von Bjarne Stroustrup (wirklich?) Ist detaillierter.
Einpoklum

29
@einpoklum Nein, ich verstehe. Ich hätte wahrscheinlich auch Bjarne Stroustrup mir vorgezogen. Nicht (schnüffeln) nehmen (schnüffeln) es (schnüffeln) persönlich (wahhhhhh) ...
Galik

Dieser Kommentar ließ mich etwas in mir fühlen, also auch +1 von mir
;-)

11

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

Änderungsprotokoll

Änderungen von R0

  • Der Name des vorgeschlagenen Typs wurde von array_viewdem spanfolgenden Feedback der LEWG auf dem Kona-Treffen geändert.
  • [...]

Wir können auch lesen:

Auswirkungen auf den Standard

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

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

spanwurde in Standard-C ++ (C ++ 11) implementiert und wird erfolgreich in einem kommerziellen statischen Analysetool für C ++ - Code sowie in einer kommerziellen 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 schreibgeschützten und schreibgeschützten ( veränderlichen ) Zugriffe vorgestellt:

Elementtypen und Konvertierungen

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

[...]


Siehe auch die Überprüfungspan<T> der Guidelines Support Library: von Marius Bancila (März 2016), definiert spanals:

Die Guidelines Support Library ist eine Microsoft-Implementierung einiger der Typen und Funktionen, die in den C ++ Core Guidelines beschrieben sind, die von der Standard C ++ Foundation verwaltet werden . Unter den von der GSL bereitgestellten Typen ist span<T>früher bekannt als array_view<T>.

span<T>Es handelt sich um einen nicht zusammenhängenden Bereich zusammenhängenden Speichers, der anstelle von Zeigern (und Größenzählern) oder Standardcontainern (wie std::vectoroder std::array) verwendet werden soll.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.