Memory2D<T>是鏡像型別功能的Memory<T>型別,其差異在於可用來表示 2D 記憶體位置。 它非常有彈性,而且能夠包裝數種不同的類型,包括 ND 陣列(明確支援 1D、2D 和 3D 陣列)或 Memory<T> 實例。 這個型別是要與 型別一Span2D<T>起使用,與一起使用Memory<T>的方式Span<T>相同。 如需這兩種類型主要差異和使用案例的詳細資訊,您可以閱讀 此文件頁面。
平臺 API:
Memory2D<T>、、Span2D<T>ReadOnlyMemory2D<T>
運作方式
此 Memory2D<T> 類型會在內部透過包裝對象的參考、高度和寬度參數,以及特殊的間距參數,追蹤對應的 2D 記憶體區域。 高度和寬度表示 2D 記憶體區域中的數據列和數據行長度,而間距則表示每個數據列結尾與下列數據列開頭之間的位移。
以下是說明此設定的簡單圖表(方格中的 “XX” 儲存格代表屬於目標 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__/
// ...________/
此組態允許 Memory2D<T> 在將現有緩衝區對應至 2D 記憶體區域的方式上具有極大的彈性,因為它也能夠將不和諧的緩衝區表示為「虛擬」2D 記憶體位置。 例如,以下是實例可以對應到的一些緩衝區類型 Memory2D 範例:
- 以數據列主要順序對應為 2D 記憶體區域的 1D
T[]陣列。 - 直接對應至 實例的
T[,]2DMemory2D<T>陣列。 - 3D
T[,,]陣列,實例Memory2D<T>代表指定的深度配量(層次)。
此 Memory2D<T> 類型也會公開許多公用程式方法,包括標準 Memory<T> 實作的大部分相同 API 介面。 例如,它包含一個 Slice(int, int) 方法,可讓您輕鬆地直接在虛擬 2D 記憶體位置上執行 2D 切割作業,而 實例會在內部自動調整必要的參數, Memory2D<T> 以在對應至所要求結果的右側記憶體區域上移轉其對應。
語法
以下說明如何從 2D 陣列建立 Memory2D<T> 實例:
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>
ReadOnlyMemory2D<T>是 ,Memory2D<T>其類型為 ReadOnlyMemory<T> 。Memory<T> 它會公開相同的確切功能(減去涉及修改已包裝記憶體區域內容的 API),並提供任意 2D 記憶體位置的只讀檢視。 如需此類型運作方式的詳細資訊,您可以參考上述類型的段落 Memory2D<T> 。
範例
您可以在單元測試中找到更多範例。