Qual è la differenza tra span e array_view nella libreria gsl?


94

In diverse recenti presentazioni di conferenze ho sentito Bjarne Stroustrup e altri menzionare nuove linee guida di codifica per C ++ e alcuni tipi che le supportano.

Nello specifico, ricordo l'esempio di span<T>invece che (T* p, int n)come parametro di una funzione (all'ora circa 32:00 del discorso); ma ricordo anche il suggerimento da usare array_view<T>. Sono due alternative ma lo stesso concetto? O sto confondendo le cose e in realtà non sono così correlate?

Non riesco a trovare alcuna definizione autorevole di ciò che dovrebbero essere entrambi.


@DavidHaim: vedi modifica, così come qui per esempio.
— einpoklum

Ci sono implementazioni e proposte di visualizzazione array in circolazione. Li hai guardati?
— Yakk - Adam Nevraumont

1
Credo che sia array_viewstato ribattezzato span.
— Galik

@Galik: puoi fornire prove? Se puoi, scrivilo come risposta e accetterò ...
— einpoklum

@ Yakk: Beh, sì, un po ', ma mi sembra di vedere cose che non sono necessariamente correlate, come parte di Microsoft C ++ AMP, ecc. Ho pensato che potesse esserci più di una cosa chiamata in array_viewgiro.
— einpoklum

Risposte:


188

Abbiamo parlato con le persone del gruppo di lavoro della biblioteca nel comitato degli standard . Volevano che il testo array_viewche stanno cercando di entrare nello standard fosse letto. Per le linee guida fondamentali, avevamo bisogno di un'astrazione che fosse letta e scritta. Per evitare uno scontro tra i (potenziali) standard e la libreria di supporto delle linee guida (GSL), abbiamo rinominato la nostra (lettura e scrittura) array_viewin span: https://github.com/microsoft/gsl .


41
E in const array_view<T>più array view<const T>non è stato soddisfacente?
— einpoklum

Grazie per esserti impegnato nel mantra delle astrazioni a costo zero: penso davvero che spansalverebbe molti programmatori dal fare errori stupidi. Penso che la comunicazione di questi nuovi cambiamenti potrebbe essere fatta in modo più chiaro però. Mi chiedo solo: non sarebbe qualcosa che potrebbe essere risolto in modo altrettanto chiaro con un normale iteratore ad accesso casuale? Il tipo è stato aggiunto solo per chiarezza?
— Benjamin Gruenbaum

6
Questo era un discorso sulle risorse e sui puntatori sospesi. span e il GSL era un problema secondario. Dai un'occhiata al discorso CppCon 2015 di Neil MacIntosh: "Evoluzione di array_view e string_view per codice C ++ sicuro" youtube.com/watch?v=C4Z3c4Sv52U e / o dai un'occhiata alla fonte GSL: github.com/microsoft/gsl . lavorando anche su una specifica formale (stile standard)
— Bjarne Stroustrup

5
C'era la preoccupazione che "visualizzazione" implicasse solo guardare i contenuti, non modificarli, quindi alcune persone volevano un suffisso diverso per la versione di lettura / scrittura. Non credo che a nessuno importi molto di un tipo array_view di sola lettura esistente. È string_view che alle persone interessa essere di sola lettura per impostazione predefinita.
— Jeffrey Yasskin

In qualità di programmatore grafico in cui "vista" significa semplicemente la vista corrente dei dati di lettura / scrittura (ad es. GlViewPort, SetViewport di D3D), rendere "vista" di sola lettura è sorprendente, ma al di fuori della grafica, suppongo di poter vedere la sensazione di "vista" di più come una finestra di sola lettura rispetto a una finestra di lettura / scrittura.
— Dwayne Robinson

45

Nelle CppCoreGuidlines L'originale è array_viewstato rinominato span.

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

È così descritto:

span è un'alternativa sicura e controllata dai limiti all'uso dei puntatori per accedere agli array


2
Ti ho fatto +1, ma la risposta di Bjarne Stroustrup (davvero?) È più dettagliata.
— einpoklum

30
@einpoklum No, ho capito. Probabilmente avrei scelto anche Bjarne Stroustrup al posto mio. Non (annusare) prendere (annusare) (annusare) personale (wahhhhhh) ...
— Galik

1
Quel commento mi ha fatto sentire qualcosa dentro, quindi +1 anche da parte mia ;-)
— YePhIcK

11

Il documento P0122R (2016-02-12) del Library Evolution Working Group (LEWG)
rinomina ufficialmente il tipo array_viewinspan :

Changelog

Modifiche da R0

  • Cambiato il nome del tipo proposto da array_viewal spanseguente feedback da LEWG alla riunione di Kona.
  • [...]

Possiamo anche leggere:

Impatto sullo standard

Questa proposta è una pura estensione della libreria. Non richiede modifiche a classi, funzioni o intestazioni standard. Sarebbe migliorato se potesse dipendere dal bytetipo e dalle modifiche al comportamento di aliasing del tipo proposto in P0257 .

Tuttavia, se adottato, potrebbe essere utile sovraccaricare alcune funzioni di libreria standard per questo nuovo tipo (un esempio sarebbe copy()).

spanè stato implementato nello standard C ++ (C ++ 11) e viene utilizzato con successo all'interno di uno strumento di analisi statica commerciale per il codice C ++ e nel software di produttività per ufficio commerciale. Un'implementazione di riferimento open source è disponibile su https://github.com/Microsoft/GSL .

In un prossimo capitolo, questo documenti presenta la sola lettura e lettura-scrittura ( mutevole ) accessi:

Tipi di elementi e conversioni

spandeve essere configurato con il suo tipo di elemento tramite il parametro template ValueType, che deve essere un tipo di oggetto completo che non è un tipo di classe astratta. spansupporta l'accesso in sola lettura o modificabile alla sequenza che incapsula. Per accedere ai dati di sola lettura, l'utente può dichiarare a span<const T>, e l'accesso ai dati modificabili userebbe a span<T>.

[...]


Vedere anche la revisione della libreria di supporto delle linee guida:span<T> da Marius Bancila (marzo 2016) che definisce spancome:

La libreria di supporto delle linee guida è un'implementazione Microsoft di alcuni dei tipi e delle funzioni descritti nelle linee guida di base di C ++ gestite dalla Fondazione C ++ standard . Tra i tipi forniti dalla GSL è span<T>precedentemente noto come array_view<T>.

span<T>è un intervallo non di proprietà di memoria contigua che si consiglia di utilizzare al posto dei puntatori (e del contatore delle dimensioni) o dei contenitori standard (come std::vectoro std::array).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.