Jaka jest różnica między span i array_view w bibliotece gsl?

94

W kilku ostatnich prezentacjach konferencyjnych słyszałem, jak Bjarne Stroustrup i inni wspominali o nowych wytycznych kodowania dla C ++ i niektórych typach je wspierających.

W szczególności pamiętam przykład span<T>zamiast (T* p, int n)jako parametr funkcji (w czasie około 32:00 w trakcie rozmowy); ale pamiętam też sugestię użycia array_view<T>. Czy to dwie alternatywy, ale ta sama koncepcja? A może mylę rzeczy i nie są one tak powiązane?

Nie mogę znaleźć żadnej autorytatywnej definicji tego, o czym obaj powinni być.

einpoklum
źródło
@DavidHaim: Zobacz edycję, a także tutaj na przykład.
einpoklum
Istnieją implementacje i propozycje widoku tablicowego na wolności. Czy spojrzałeś na nie?
Yakk - Adam Nevraumont
1
Wydaje mi się, że array_viewzmieniono nazwę na span.
Galik
@Galik: Czy możesz przedstawić dowody? Jeśli możesz, napisz to jako odpowiedź i przyjmuję ...
einpoklum
@Yakk: Cóż, tak, trochę, ale wydaje mi się, że widzę rzeczy, które niekoniecznie są ze sobą powiązane, na przykład część Microsoft C ++ AMP itp. Pomyślałem, że może krążyć więcej niż jedna rzecz o nazwie array_view.
einpoklum

Odpowiedzi:

189

Rozmawialiśmy z osobami z grupy roboczej biblioteki w komitecie normalizacyjnym . Chcieli, aby treść, array_viewktórą próbują dostać się do standardu, była tylko do odczytu. Aby uzyskać podstawowe wytyczne, potrzebowaliśmy abstrakcji, którą można było czytać i pisać. Aby uniknąć konfliktu między (potencjalnymi) standardami a biblioteką obsługi wytycznych (GSL), zmieniliśmy nazwę naszego (odczytu i zapisu) array_viewna span: https://github.com/microsoft/gsl .

Bjarne Stroustrup
źródło
41
A const array_view<T>plus array view<const T>nie był zadowalający?
einpoklum
Dziękuję za zaangażowanie w mantrę o zerowych kosztach abstrakcji - naprawdę myślę, spanże uratowałoby to wielu programistów przed popełnieniem głupich błędów. Myślę, że można by było przekazać te nowe zmiany w jaśniejszy sposób. Zastanawiam się tylko - czy nie byłoby to coś, co można rozwiązać tak wyraźnie za pomocą zwykłego iteratora dostępu swobodnego? Czy typ został dodany tylko dla jasności?
Benjamin Gruenbaum
6
To była rozmowa o zasobach i wiszących wskazówkach. span i GSL był problemem pobocznym. Obejrzyj wykład Neila MacIntosha na temat CppCon 2015: „Evolving array_view and string_view for safe C ++ code” youtube.com/watch?v=C4Z3c4Sv52U i / lub zajrzyj do źródła GSL: github.com/microsoft/gsl . Jesteśmy pracuję również nad formalną (standardową stylistyką) specyfikacją
Bjarne Stroustrup
5
Obawiano się, że „widok” oznacza po prostu przeglądanie zawartości, a nie modyfikowanie ich, więc niektórzy ludzie chcieli innego sufiksu dla wersji do odczytu / zapisu. Nie sądzę, aby ktokolwiek przejmował się istniejącym typem array_view tylko do odczytu. Jest to string_view, że ludzie powinni domyślnie być tylko do odczytu.
Jeffrey Yasskin
Jako programista grafiki, w którym „widok” oznacza jedynie bieżący widok danych do odczytu / zapisu (np. GlViewPort, SetViewport D3D), ustawienie „widoku” jako tylko do odczytu jest zaskakujące, ale poza grafiką, przypuszczam, że widzę „widok” bardziej jak okno tylko do odczytu niż okno do odczytu / zapisu.
Dwayne Robinson
45

W CppCoreGuidlines Oryginalna array_viewnazwa została zmieniona na span.

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

Jest to opisane w ten sposób:

span to bezpieczna alternatywa dla używania wskaźników w celu uzyskania dostępu do tablic

Galik
źródło
2
Dałem ci +1, ale odpowiedź Bjarne Stroustrupa (naprawdę?) Jest bardziej szczegółowa.
einpoklum
30
@einpoklum Nie, rozumiem. Prawdopodobnie wybrałbym też Bjarne Stroustrupa zamiast mnie. Not (sniff) biorąc (sniff) it (sniff) personal (wahhhhhh) ...
Galik
1
Ten komentarz sprawił, że poczułem coś w środku, więc +1 ode mnie też ;-)
YePhIcK
11

Dokument P0122R (12.02.2016) z Library Evolution Working Group (LEWG)
oficjalnie zmienia nazwę typu array_viewnaspan :

Changelog

Zmiany w stosunku do R0

  • Zmieniono nazwę proponowanego typu z array_viewna spannastępującą informację zwrotną od LEWG na spotkaniu Kona.
  • […]

Możemy również przeczytać:

Wpływ na standard

Ta propozycja jest czystym rozszerzeniem biblioteki. Nie wymaga żadnych zmian w standardowych klasach, funkcjach ani nagłówkach. Byłoby to ulepszone, gdyby mogło zależeć od bytetypu i zmian w zachowaniu aliasingu typu zaproponowanych w P0257 .

Jednak - jeśli zostanie przyjęty - może być przydatne przeładowanie niektórych standardowych funkcji bibliotecznych dla tego nowego typu (przykładem może być copy()).

spanzostał zaimplementowany w standardowym C ++ (C ++ 11) i jest z powodzeniem używany w komercyjnym narzędziu do analizy statycznej kodu C ++, a także w oprogramowaniu biurowym. Implementacja referencyjna typu open source jest dostępna pod adresem https://github.com/Microsoft/GSL .

W następnym rozdziale ten dokument przedstawia dostęp tylko do odczytu i do odczytu i zapisu ( zmienny ):

Typy i konwersje elementów

spanmusi być skonfigurowany z typem elementu za pomocą parametru template ValueType, który musi być kompletnym typem obiektu, który nie jest abstrakcyjnym typem klasy. spanobsługuje dostęp tylko do odczytu lub zmienny dostęp do sekwencji, którą zawiera. Aby uzyskać dostęp do danych tylko do odczytu, użytkownik może zadeklarować a span<const T>, a dostęp do danych modyfikowalnych używałby pliku span<T>.

[…]


Zobacz także Guidelines Support Library Review:span<T> Marius Bancila (marzec 2016) definiując spanjako:

Wytyczne Biblioteka Pomoc jest wdrożenie Microsoft niektórych typów i funkcji opisanych w ++ C podstawowych wytycznych prowadzonego przez ++ Fundacji standard C . Wśród typów udostępnianych przez GSL jest span<T>wcześniej znany jako array_view<T>.

span<T>to nie będący właścicielem zakres ciągłej pamięci, który zaleca się używać zamiast wskaźników (i licznika rozmiaru) lub standardowych kontenerów (takich jak std::vectorlub std::array).

olibre
źródło