Pamięć2D<T>
Jest Memory2D<T>
to typ, który odzwierciedla funkcjonalność Memory<T>
typu, a różnica polega na tym, że może służyć do reprezentowania lokalizacji pamięci 2D. Jest bardzo elastyczny i może opakowować wiele różnych typów, w tym tablic ND (z jawną obsługą tablic 1D, 2D i 3D) lub Memory<T>
wystąpień. Ten typ ma być używany razem z typem Span2D<T>
w taki sam sposób, jak Memory<T>
używany wraz z Span<T>
. Aby uzyskać więcej informacji na temat kluczowych różnic i scenariuszy przypadków użycia tych dwóch typów, możesz przeczytać tę stronę dokumentacji.
Interfejsy API platformy:
Memory2D<T>
, ,Span2D<T>
ReadOnlyMemory2D<T>
Jak to działa
Memory2D<T>
Typ wewnętrznie śledzi zamapowany obszar pamięci 2D przez odwołanie do opakowanego obiektu, parametrów wysokości i szerokości oraz specjalnego parametru pitch. Wysokość i szerokość wskazują długość wierszy i kolumn w obszarze pamięci 2D, a wysokość wskazuje przesunięcie między końcem każdego wiersza a początkiem poniższego.
Oto prosty diagram ilustrujący tę konfigurację (komórki "XX" w siatce reprezentują elementy należące do docelowego obszaru pamięci 2D):
// _____________________stride_____...
// reference__ /________width_________ ________...
// \/ \/
// | -- | -- | |- | -- | -- | -- | -- | -- | -- | -- |_
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- | |
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- | |
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- | |_height
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- |_|
// | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
// | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
// ...__pitch__/
// ...________/
Ta konfiguracja umożliwia Memory2D<T>
bardzo elastyczne mapowanie istniejących na obszary pamięci 2D, ponieważ umożliwia również reprezentowanie nieciągłych jako "wirtualnej" lokalizacji pamięci 2D. Oto kilka przykładów typów, które Memory2D
wystąpienie może mapować na:
- Tablica 1D
T[]
, która jest mapowana jako obszar pamięci 2D w kolejności głównej wiersza. - Tablica 2D
T[,]
mapowana bezpośrednio naMemory2D<T>
wystąpienie. - Tablica 3D
T[,,]
zMemory2D<T>
wystąpieniem reprezentującym dany wycinek głębokości (warstwa).
Typ Memory<T>
uwidacznia również wiele metod narzędziowych, w tym większość tej samej powierzchni interfejsu API, którą implementuje standard Memory<T>
. Na przykład zawiera metodę Slice(int, int)
, która ułatwia wykonywanie operacji fragmentowania 2D bezpośrednio w wirtualnej lokalizacji pamięci 2D, a Memory2D<T>
wystąpienie automatycznie dostosowuje wymagane parametry wewnętrznie, aby zmienić mapowanie na odpowiednie obszary pamięci odpowiadające żądanym wynikowi.
Składnia
Oto jak utworzyć Memory2D<T>
wystąpienie na podstawie tablicy 2D:
int[,] array =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
Memory2D<int> memory = array;
// The memory directly maps the 2*3 array here
Memory2D<int> slice = memory.Slice(0, 1, 2, 2);
// We create a slice from row 0 and column 1, of size 2*2
int[,] copy = slice.ToArray();
// { 2, 3 }
// { 5, 6 }
// If on a supported runtime, we can also slice using a range
Memory2D<int> test = memory[.., ..2];
// { 1, 2 }
// { 4, 5 }
// { 7, 8 }
Span2D<int> span = memory.Span;
// We can use the span to perform operations on the underlying
// data for the memory instance. All the available APIs are
// documented in the docs about the Span2D<T> type.
ReadOnlyMemory2D<T>
Element ReadOnlyMemory2D<T>
to Memory2D<T>
typ, co ReadOnlyMemory<T>
to jest Memory<T>
. Uwidacznia dokładnie te same funkcje (minus interfejsy API, które obejmują modyfikowanie zawartości opakowanego obszaru pamięci) i udostępnia widok tylko do odczytu do dowolnych lokalizacji pamięci 2D. Aby uzyskać więcej informacji na temat działania tego typu, możesz zapoznać się z akapitem w powyższym typie Memory2D<T>
.
Przykłady
.NET Community Toolkit