Memory2D<T>

Jedná se Memory2D<T> o typ, který zrcadlí funkčnost Memory<T> typu, přičemž rozdíl je v tom, že lze použít k reprezentaci 2D umístění paměti. Je extrémně flexibilní a dokáže zabalit řadu různých typů, včetně polí ND (s explicitní podporou 1D, 2D a 3D polí) nebo Memory<T> instancí. Tento typ je určen k použití společně s Span2D<T> typem stejným způsobem, jakým Memory<T> se používá spolu s Span<T>. Další informace o klíčových rozdílech a scénářích použití těchto dvou typů najdete na této stránce dokumentace.

Rozhraní API platformy:Memory2D<T>, Span2D<T>, ReadOnlyMemory2D<T>

Jak to funguje

Typ Memory2D<T> interně sleduje mapovanou 2D oblast paměti prostřednictvím odkazu na zabalený objekt, parametry výšky a šířky a speciální parametr rozteč. Výška a šířka označují délku řádků a sloupců v oblasti 2D paměti, zatímco sklon označuje posun mezi koncem každého řádku a začátkem následujícího řádku.

Tady je jednoduchý diagram, který znázorňuje tuto konfiguraci (buňky XX v mřížce představují položky patřící do cílové oblasti 2D paměti):

//                _____________________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__/
// ...________/

Tato konfigurace umožňuje Memory2D<T> extrémně flexibilní způsob, jakým mapuje existující vyrovnávací paměti na 2D oblasti paměti, protože umožňuje také reprezentovat diskontubilní vyrovnávací paměti jako "virtuální" 2D umístění paměti. Tady je například několik příkladů typů vyrovnávací paměti, na které Memory2D se instance může mapovat:

  • Pole 1D T[] mapované jako 2D oblast paměti v hlavním pořadí řádků.
  • 2D T[,] pole mapované přímo na Memory2D<T> instanci.
  • 3D T[,,] pole s Memory2D<T> instancí představující danou hloubkovou výseč (vrstvu).

Tento Memory<T> typ také zveřejňuje řadu pomocných metod, včetně většiny stejných povrchů rozhraní API, které standard Memory<T> implementuje. Zahrnuje například metodu Slice(int, int) , která usnadňuje 2D operace dělení řezů přímo na virtuálním 2D paměťovém umístění, přičemž Memory2D<T> instance automaticky upraví nezbytné parametry interně tak, aby se mapování přesunulo na správné oblasti paměti odpovídající požadovanému výsledku.

Syntaxe

Tady je postup, jak vytvořit Memory2D<T> instanci z 2D pole:

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>

Jedná ReadOnlyMemory2D<T> se o Memory2D<T> typ, co ReadOnlyMemory<T> je .Memory<T> Zpřístupňuje stejné přesné funkce (bez rozhraní API, která zahrnují úpravu obsahu zabalené oblasti paměti) a poskytuje zobrazení jen pro čtení pro libovolná 2D umístění paměti. Další informace o tom, jak tento typ funguje, najdete v odstavci výše Memory2D<T> uvedeného typu.

Příklady

Další příklady najdete v testech jednotek.