O que é string_view?

162

string_viewfoi um recurso proposto no TS Fundamentals da biblioteca C ++ ( N3921 ) adicionado ao C ++ 17

Tanto quanto eu entendo, é um tipo que representa algum tipo de "conceito" de string que é uma visualização de qualquer tipo de contêiner que possa armazenar algo visível como uma string.

  • Isto está certo ?
  • O const std::string&tipo de parâmetro canônico deve se tornar string_view?
  • Existe outro ponto importante string_viewa ser levado em consideração?
Drax
fonte
4
Finalmente, alguém percebe que as strings precisam de uma semântica diferente, embora a introdução de string_view seja apenas um pequeno passo.
John Z. Li

Respostas:

183

O objetivo de todo e qualquer tipo de proposta de "referência de cadeia" e "referência de matriz" é evitar a cópia de dados que já pertencem a outro lugar e dos quais é necessária apenas uma visão não mutante. A string_viewquestão em questão é uma dessas propostas; havia ligações anteriores string_refe array_reftambém.

A idéia é sempre armazenar um par de ponteiro para o primeiro elemento e tamanho de alguma matriz ou sequência de dados existente .

Essa classe de identificador de exibição poderia ser distribuída mais barata por valor e ofereceria operações de substringing baratas (que podem ser implementadas como simples incrementos de ponteiro e ajustes de tamanho).

Muitos usos de cadeias de caracteres não requerem a propriedade real das cadeias de caracteres, e a cadeia em questão muitas vezes já será de propriedade de outra pessoa. Portanto, existe um potencial genuíno para aumentar a eficiência, evitando cópias desnecessárias (pense em todas as alocações e exceções que você pode salvar).

As cadeias C originais estavam sofrendo com o problema de o terminador nulo fazer parte das APIs da cadeia e, portanto, não era possível criar facilmente subseqüências sem alterar a cadeia subjacente (à la strtok). No C ++, isso é facilmente resolvido armazenando o comprimento separadamente e envolvendo o ponteiro e o tamanho em uma classe.

O principal obstáculo e divergência da filosofia da biblioteca padrão C ++ em que consigo pensar é que essas classes de "exibição referencial" têm semântica de propriedade completamente diferente do restante da biblioteca padrão. Basicamente, tudo o mais na biblioteca padrão é incondicionalmente seguro e correto (se compilar, está correto). Com classes de referência como essa, isso não é mais verdade. A correção do seu programa depende do código do ambiente que usa essas classes. Portanto, é mais difícil verificar e ensinar.

Kerrek SB
fonte
19
O navio navegou nessa filosofia com reference_wrapper, não foi?
precisa
5
@KerrekSB Receio não seguir. Você poderia expandir a parte "essas classes de exibição referencial têm semântica de propriedade completamente diferente da parte restante da biblioteca padrão" , por favor? Não está claro para mim: como é diferente de referências / indicadores pendentes? Ou iteradores invalidados devido à inserção (por exemplo, std :: vector)? Já temos esses problemas, é muito natural para mim que uma visão não proprietária tenha problemas semelhantes aos dos ponteiros / referências / iteradores não proprietários.
Ali
5
@ Ali: Quando você está usando qualquer outro contêiner de biblioteca padrão, pode afirmar a correção do código apenas olhando o código que usa o contêiner. Não é assim string_view. (Eu não estava dizendo que você nunca pode escrever código quebrado. Só que a quebra é local .) #
Kerrek SB 27/12/13
6
Estou surpreso que não foi com std::rangede boost::iterator_range- IMO é melhor do que a idéia string_view
Charles Salvia
19
@nwp: Muitas pessoas e idiomas lamentaram os terríveis padrões do C ++ e pensam que "const" e "não compartilhado" devem ser o padrão, com "mutable" e "shared" as explícitas e raras exceções.
9115 Kerrek SB