Freigeben über


Memory2D<T>

Der Memory2D<T> ist ein Typ, der die Funktionalität des Memory<T>-Typs widerspiegelt, wobei der Unterschied darin besteht, dass er verwendet werden kann, um 2D-Arbeitsspeicherorte darzustellen. Er ist äußerst flexibel und kann eine Reihe verschiedener Typen umschließen, einschließlich ND-Arrays (mit expliziter Unterstützung für 1D-, 2D- und 3D-Arrays) oder Memory<T>-Instanzen. Dieser Typ soll zusammen mit dem Span2D<T>-Typ verwendet werden, und zwar auf die gleiche Weise, wie Memory<T> zusammen mit Span<T> verwendet wird. Weitere Informationen zu den wichtigsten Unterschieden und Anwendungsfallszenarien dieser beiden Typen finden Sie auf dieser Dokumentationsseite.

Plattform-APIs: Memory2D<T>, Span2D<T>, ReadOnlyMemory2D<T>

Funktionsweise

Der Memory2D<T>-Typ verfolgt den zugeordneten 2D-Arbeitsspeicherbereich intern durch einen Verweis auf das umschlossene Objekt, die Parameter für Höhe und Breite und einen speziellen Abstandsparameter. Die Höhe und Breite geben die Länge der Zeilen und Spalten im 2D-Arbeitsspeicherbereich an, während der Abstand den Versatz zwischen dem Ende jeder Zeile und dem Anfang der folgenden Zeile angibt.

Hier ist ein einfaches Diagramm, das diese Konfiguration veranschaulicht (die Zellen „XX“ im Raster stellen Elemente dar, die zum 2D-Zielarbeitsspeicherbereich gehören):

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

Diese Konfiguration ermöglicht es Memory2D<T>, extrem flexibel in der Art und Weise zu sein, wie es vorhandene Puffer zu 2D-Arbeitsspeicherbereichen zuordnet, da es möglich ist, auch nicht zusammenhängende Puffer als „virtuellen“ 2D-Arbeitsspeicherort darzustellen. Hier sind einige Beispiele für Puffertypen, denen eine Memory2D-Instanz zugeordnet werden kann:

  • Ein 1D-T[]-Array, das als 2D-Arbeitsspeicherbereich in Zeilenhauptreihenfolge zugeordnet ist.
  • Ein 2D-T[,]-Array, das direkt einer Memory2D<T>-Instanz zugeordnet ist.
  • Ein 3D-T[,,]-Array mit einer Memory2D<T>-Instanz, die ein bestimmtes Tiefensegment (eine Ebene) darstellt.

Der Memory<T>-Typ macht auch eine Reihe von Hilfsmethoden verfügbar, einschließlich der meisten Hilfsmethoden der gleichen API-Oberfläche, die der Standard Memory<T> implementiert. Er enthält z. B. eine Slice(int, int)-Methode, die es einfach macht, 2D-Segmentierungsvorgänge direkt am virtuellen 2D-Arbeitsspeicherort auszuführen, wobei die Memory2D<T>-Instanz die erforderlichen Parameter intern anpasst, um ihre Zuordnung auf die richtigen Speicherbereiche entsprechend dem angeforderten Ergebnis zu verschieben.

Syntax

So können Sie eine Memory2D<T>-Instanz aus einem 2D-Array erstellen:

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>

Der ReadOnlyMemory2D<T> ist für den Memory2D<T>-Typ, was ReadOnlyMemory<T> für Memory<T> ist. Er macht dieselben genauen Funktionen verfügbar (ohne die APIs, die eine Änderung des Inhalts des umschlossenen Arbeitsspeicherbereichs beinhalten) und stellt eine schreibgeschützte Ansicht für beliebige 2D-Arbeitsspeicherorte bereit. Weitere Informationen zur Funktionsweise dieses Typs finden Sie im Absatz zum Memory2D<T>-Typ oben.

Beispiele

Weitere Beispiele finden Sie in den Komponententests.