Udostępnij za pośrednictwem


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 na Memory2D<T> wystąpienie.
  • Tablica 3D T[,,] z Memory2D<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

Więcej przykładów można znaleźć w testach jednostkowych.