Qual é a diferença entre span e array_view na biblioteca gsl?

94

Em várias apresentações em conferências recentes, ouvi Bjarne Stroustrup e outros mencionarem novas diretrizes de codificação para C ++ e alguns tipos que as suportam.

Especificamente, lembro -span<T>(T* p, int n) me do exemplo de em vez de como um parâmetro para uma função (na hora cerca de 32:00 na conversa); mas também me lembro da sugestão de usar array_view<T>. São duas alternativas, mas o mesmo conceito? Ou estou confundindo as coisas e elas não estão tão relacionadas?

Não consigo encontrar nenhuma definição oficial do que eles deveriam tratar.

einpoklum
fonte
@DavidHaim: Veja editar, assim como aqui por exemplo.
einpoklum
Existem implementações e propostas de visualização de matriz na natureza. Você já olhou para eles?
Yakk - Adam Nevraumont
1
Eu acredito que array_viewfoi renomeado para span.
Galik
@Galik: Você pode fornecer evidências? Se você puder, escreva como uma resposta e eu aceito ...
einpoklum
@Yakk: Bem, sim, um pouco, mas parece que vejo coisas que não estão necessariamente relacionadas, como parte do Microsoft C ++ AMP etc. Achei que poderia haver mais de uma coisa chamada array_viewflutuando por aí.
einpoklum

Respostas:

187

Conversamos com pessoas do grupo de trabalho da biblioteca no comitê de padrões . Eles queriam array_viewque o padrão fosse somente leitura. Para as diretrizes básicas, precisávamos de uma abstração que fosse lida e escrita. Para evitar um conflito entre os padrões (potenciais) e a biblioteca de suporte às diretrizes (GSL), renomeamos nosso (leitura e gravação) array_viewpara span: https://github.com/microsoft/gsl .

Bjarne Stroustrup
fonte
41
E const array_view<T>mais array view<const T>não foi satisfatório?
einpoklum
Obrigado por se comprometer com o mantra de abstrações de custo zero - eu realmente acho que spanevitaria que muitos programadores cometessem erros bobos. Eu acho que comunicar essas novas mudanças poderia ser feito de uma forma mais clara. Estou apenas pensando - isso não seria algo que poderia ser resolvido claramente com um iterador regular de acesso aleatório? O tipo foi adicionado apenas para maior clareza?
Benjamin Gruenbaum
6
Esta foi uma palestra sobre recursos e dicas pendentes. span e o GSL era um problema secundário. Dê uma olhada na palestra CppCon 2015 de Neil MacIntosh: “Evolvendo array_view e string_view para código C ++ seguro" youtube.com/watch?v=C4Z3c4Sv52U e / ou dê uma olhada na fonte GSL: github.com/microsoft/gsl . também trabalhando em uma especificação formal (estilo padrão).
Bjarne Stroustrup
5
Havia uma preocupação de que "visualizar" implicava apenas em olhar para o conteúdo, não modificá-lo, então algumas pessoas queriam um sufixo diferente para a versão de leitura / gravação. Eu não acho que alguém se preocupa muito com a existência de um tipo array_view somente leitura. É string_view que as pessoas querem ser somente leitura por padrão.
Jeffrey Yasskin
Como um codificador de gráficos em que 'view' significa apenas a visão atual de dados de leitura / gravação (por exemplo, glViewPort, SetViewport do D3D), tornar "view" somente leitura é surpreendente, mas fora dos gráficos, suponho que poderia ver 'view' sentindo mais como uma janela somente leitura do que uma janela de leitura / gravação.
Dwayne Robinson
44

No CppCoreGuidlines O original array_viewfoi renomeado para span.

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

É descrito assim:

span é uma alternativa segura com verificação de limites ao uso de ponteiros para acessar matrizes

Galik
fonte
2
Marquei você com +1, mas a resposta de Bjarne Stroustrup (realmente?) É mais detalhada.
einpoklum
29
@einpoklum Não, entendi. Eu provavelmente teria escolhido Bjarne Stroustrup em vez de mim também. Não (cheirar) tomar (cheirar) (cheirar) pessoal (wahhhhhh) ...
Galik
Esse comentário me fez sentir algo por dentro, então +1 de mim também ;-)
YePhIcK
11

O documento P0122R (2016-02-12) do Library Evolution Working Group (LEWG)
renomeia oficialmente o tipo array_viewparaspan :

Changelog

Mudanças de R0

  • Alterado o nome do tipo proposto array_viewpara spanapós o feedback do LEWG na reunião de Kona.
  • [...]

Também podemos ler:

Impacto no padrão

Esta proposta é uma extensão de biblioteca pura. Não requer nenhuma alteração nas classes, funções ou cabeçalhos padrão. Seria melhorado se pudesse depender do bytetipo e das mudanças no comportamento de aliasing de tipo proposto em P0257 .

No entanto - se adotado - pode ser útil sobrecarregar algumas funções da biblioteca padrão para este novo tipo (um exemplo seria copy()).

spanfoi implementado em C ++ padrão (C ++ 11) e está sendo usado com sucesso em uma ferramenta de análise estática comercial para código C ++, bem como em software comercial de produtividade de escritório. Uma implementação de referência de código aberto está disponível em https://github.com/Microsoft/GSL .

Em um próximo capítulo, este documento apresenta os acessos somente leitura e leitura / gravação ( mutáveis ):

Tipos de elemento e conversões

spandeve ser configurado com seu tipo de elemento por meio do parâmetro de modelo ValueType, que é necessário para ser um tipo de objeto completo que não é um tipo de classe abstrata. spansuporta acesso somente leitura ou mutável à sequência que encapsula. Para acessar dados somente leitura, o usuário pode declarar a span<const T>, e o acesso aos dados mutáveis ​​usaria a span<T>.

[...]


Consulte também a Revisão da Biblioteca de Apoiospan<T> às Diretrizes: de Marius Bancila (março de 2016) definindo spancomo:

A Biblioteca de Suporte de Diretrizes é uma implementação da Microsoft de alguns dos tipos e funções descritos nas Diretrizes Básicas C ++ mantidas pela Standard C ++ Foundation . Entre os tipos fornecidos pelo GSL é span<T>anteriormente conhecido como array_view<T>.

span<T>é um intervalo não proprietário de memória contígua recomendado para ser usado em vez de ponteiros (e contador de tamanho) ou contêineres padrão (como std::vectorou std::array).

Olibre
fonte