Memory2D<T> – třída

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 v pokynech k použití paměti<T>.

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če. 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> být extrémně flexibilní při mapování existujících vyrovnávacích pamětí na 2D oblasti paměti, protože umožňuje také reprezentovat nesouvislé vyrovnávací paměti jako "virtuální" 2D paměťové místo. Příklady typů vyrovnávací paměti, na které může instance Memory2D mapovat, jsou následující:

  • Jednorozměrné pole T[] namapované jako dvojrozměrná oblast paměti v řádkovém pořadí.
  • 2D T[,] pole, které je přímo mapováno na Memory2D<T> instanci.
  • 3D T[,,] pole s Memory2D<T> instancí představující danou hloubkovou výseč (vrstvu).

Tento Memory2D<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 přesunula mapování 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);

// 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, you can also slice using a range:
Memory2D<int> test = memory[.., ..2];

// { 1, 2 }
// { 4, 5 }
// { 7, 8 }

Span2D<int> span = memory.Span;

// You 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>

Typ ReadOnlyMemory2D<T> je k typu Memory2D<T> jako ReadOnlyMemory<T> k 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 předchozím odstavci tohoto Memory2D<T> typu.

Příklady

Další příklady najdete v jednotkových testech.