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.