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.


@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 .


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


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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.