Che cos'è string_view?


162

string_viewera una caratteristica proposta all'interno della C ++ Library Fundamentals TS ( N3921 ) aggiunta a C ++ 17

Per quanto ho capito, è un tipo che rappresenta una sorta di "concetto" di stringa che è una vista di qualsiasi tipo di contenitore che potrebbe contenere qualcosa di visualizzabile come una stringa.

  • È giusto ?
  • Il const std::string&tipo di parametro canonico dovrebbe diventare string_view?
  • C'è un altro punto importante string_viewda prendere in considerazione?

4
Infine, qualcuno si rende conto che le stringhe hanno bisogno di una semantica diversa, sebbene l'introduzione di string_view sia solo un piccolo passo.
John Z. Li

Risposte:


183

Lo scopo di ogni tipo di proposta di "riferimento di stringa" e "riferimento di matrice" è di evitare di copiare dati che sono già posseduti altrove e per i quali è richiesta solo una visione non mutante. La string_viewdomanda in questione è una di queste proposte; c'erano anche quelli precedenti chiamati string_refe array_refanche.

L'idea è sempre quella di memorizzare una coppia di puntatori al primo elemento e le dimensioni di alcuni array o stringhe di dati esistenti .

Una tale classe di handle di vista potrebbe essere passata a buon mercato in base al valore e offrirebbe operazioni di sottostringa a basso costo (che possono essere implementate come semplici incrementi del puntatore e regolazioni delle dimensioni).

Molti usi delle stringhe non richiedono l'effettivo possesso delle stringhe e la stringa in questione spesso sarà già di proprietà di qualcun altro. Quindi esiste un vero potenziale per aumentare l'efficienza evitando copie non necessarie (pensa a tutte le allocazioni e le eccezioni che puoi salvare).

Le stringhe C originali soffrivano del problema che il terminatore null faceva parte delle API delle stringhe e quindi non si potevano facilmente creare sottostringhe senza mutare la stringa sottostante (a la strtok). In C ++, questo può essere facilmente risolto memorizzando la lunghezza separatamente e avvolgendo il puntatore e la dimensione in una classe.

L'unico ostacolo e divergenza rispetto alla filosofia della libreria standard C ++ che mi viene in mente è che tali classi di "visione referenziale" hanno una semantica di proprietà completamente diversa dal resto della libreria standard. Fondamentalmente, tutto il resto nella libreria standard è incondizionatamente sicuro e corretto (se compilato, è corretto). Con classi di riferimento come questa, non è più vero. La correttezza del programma dipende dal codice ambientale che utilizza queste classi. Quindi è più difficile controllare e insegnare.


19
La nave ha navigato su quella filosofia con reference_wrapper, no?
Steve Jessop,

5
@KerrekSB Temo di non seguire. Potresti espandere la parte "tali classi di viste referenziali hanno una semantica di proprietà completamente diversa dal resto della libreria standard" , per favore? Non mi è chiaro: in cosa differisce dai riferimenti / puntatori pendenti? O iteratori non validi a causa dell'inserimento (ad es. Std :: vector)? Abbiamo già questi problemi, per me è molto naturale che una visione non proprietaria abbia problemi simili a quelli dei puntatori / riferimenti / iteratori non proprietari.
Ali,

5
@Ali: quando si utilizza un altro contenitore di libreria standard, è possibile affermare la correttezza del codice semplicemente osservando il codice che utilizza il contenitore. Non così per string_view. (Non stavo dicendo che non puoi mai scrivere il codice non funzionante. Solo che il problema è locale .)
Kerrek SB

6
Sono sorpreso che non è andato con std::rangeda boost::iterator_range- IMO è meglio che l'idea string_view
Charles Salvia

19
@nwp: molte persone e lingue sono venute a lamentare i terribili valori predefiniti di C ++ e pensano che "const" e "unshared" dovrebbero essere il valore predefinito, con "mutable" e "share" le eccezioni esplicite e rare.
Kerrek SB,
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.