@einpoklum ma całkiem niezłą robotę, przedstawiając to, co span
jest w swojej odpowiedzi tutaj . Jednak nawet po przeczytaniu jego odpowiedzi łatwo jest komuś nowemu, aby nadal miał sekwencję pytań, na które nie ma pełnej odpowiedzi, na przykład:
- Czym
span
różni się od tablicy C? Dlaczego nie skorzystać z jednego z nich? Wygląda na to, że to tylko jeden ze znanych rozmiarów ...
- Czekaj, to brzmi jak
std::array
, czym się span
różni od tego?
- Och, to przypomina mi, nie jest
std::vector
niczym std::array
zbyt?
- Jestem zmieszany. :( Co to jest
span
?
Oto kilka dodatkowych wyjaśnień na ten temat:
BEZPOŚREDNI WYCENA JEGO ODPOWIEDZI - Z MOIMMI DODATKAMI :
Co to jest?
A span<T>
to:
- Bardzo lekka abstrakcja ciągłej sekwencji wartości typu
T
gdzieś w pamięci.
- Zasadniczo pojedyncza struktura
{ T * ptr; std::size_t length; }
z wieloma wygodnymi metodami. (Zauważ, że różni się to wyraźnie od tego, std::array<>
że span
umożliwia metody akcesorium wygodnego, porównywalne do std::array
, za pomocą wskaźnika do typuT
i długości (liczby elementów) typu T
, podczas gdy std::array
jest faktycznym pojemnikiem, który zawiera jedną lub więcej wartości typu T
).
- Typ niebędący właścicielem (tj. „Typ odniesienia” zamiast „typ wartości”): nigdy nie przydziela ani nie zwalnia niczego i nie utrzymuje inteligentnych wskaźników.
Wcześniej był znany jako, array_view
a jeszcze wcześniej jako array_ref
.
Te odważne części są kluczowe dla zrozumienia, więc nie przegap ich ani nie odczytaj ich źle! A span
NIE jest tablicą C struktur, ani nie jest strukturą typu C T
powiększoną o długość tablicy (byłby to w zasadzie std::array
kontener ), NOR jest to tablica C struktur wskaźników pisać T
plus długość, ale raczej jest to pojedyncza struktura zawierająca pojedynczy wskaźnik do pisaniaT
oraz długość , która jest liczbą elementów (typu T
) w ciągłym bloku pamięci, na który T
wskazuje wskaźnik do pisania ! W ten sposób jedyny narzut dodany przy użyciuspan
to zmienne do przechowywania wskaźnika i długości oraz wszelkie używane funkcje akcesoriów, które span
udostępnia.
Jest to w przeciwieństwie do std::array<>
, ponieważ std::array<>
rzeczywiście alokuje pamięć dla całego ciągły blok, a to jest podobna std::vector<>
, ponieważ std::vector
jest w zasadzie tylko std::array
, że również ma dynamiczny rośnie (zazwyczaj podwojenie wielkości) za każdym razem zapełnia się i spróbować dodać coś jeszcze do niego . A std::array
ma stały rozmiar, a a span
nawet nie zarządza pamięcią bloku, na który wskazuje, po prostu wskazuje blok pamięci, wie, jak długi jest blok pamięci, wie, jaki typ danych znajduje się w macierzy C. w pamięci i zapewnia dodatkowe funkcje akcesorium do pracy z elementami w tej ciągłej pamięci .
To jest część C ++ standard:
std::span
jest częścią standardu C ++ od C ++ 20. Możesz przeczytać jego dokumentację tutaj: https://en.cppreference.com/w/cpp/container/span . Aby zobaczyć, jak korzystać z Google absl::Span<T>(array, length)
w C ++ 11 lub później dzisiaj , patrz poniżej.
Opisy podsumowań i najważniejsze odniesienia:
std::span<T, Extent>
( Extent
= "liczba elementów w sekwencji lub std::dynamic_extent
dynamiczna". Rozpiętość wskazuje tylko na pamięć i ułatwia dostęp, ale NIE zarządza nią!):
- https://en.cppreference.com/w/cpp/container/span
std::array<T, N>
(zauważ, że ma ustalony rozmiar N
!):
- https://en.cppreference.com/w/cpp/container/array
- http://www.cplusplus.com/reference/array/array/
std::vector<T>
(automatycznie dynamicznie rośnie w miarę potrzeb):
- https://en.cppreference.com/w/cpp/container/vector
- http://www.cplusplus.com/reference/vector/vector/
Jak mogę użyć span
w C ++ 11 lub później dzisiaj ?
Google ma otwarte źródła wewnętrznych bibliotek C ++ 11 w formie biblioteki „Abseil”. Ta biblioteka ma na celu dostarczanie funkcji od C ++ 14 do C ++ 20 i innych, które działają w C ++ 11 i późniejszych, abyś mógł dziś korzystać z funkcji jutra. Mówią:
Zgodność ze standardem C ++
Google opracował wiele abstrakcji, które pasują lub ściśle pasują do funkcji zawartych w C ++ 14, C ++ 17 i innych. Korzystanie z wersji Abseil tych abstrakcji umożliwia teraz dostęp do tych funkcji, nawet jeśli kod nie jest jeszcze gotowy do życia w świecie post C ++ 11.
Oto niektóre kluczowe zasoby i linki:
- Strona główna: https://abseil.io/
- https://abseil.io/docs/cpp/
- Repozytorium GitHub: https://github.com/abseil/abseil-cpp
span.h
nagłówek i absl::Span<T>(array, length)
klasa szablonów: https://github.com/abseil/abseil-cpp/blob/master/absl/types/span.h#L189
std::span
został zaproponowany w 2017 r. Dotyczy C ++ 17 lub C ++ 20. Zobacz także P0122R5, span: bezpieczne widoki dla sekwencji obiektów . Czy naprawdę chcesz kierować na ten język? Miną lata, zanim kompilatory nadrobią zaległości.