Memory2D<T>
Memory2D<T>
是一种反映 Memory<T>
类型功能的类型,区别在于它可用于表示 2D 内存位置。 它非常灵活,能够包装多种不同类型(包括 ND 数组,显式支持 1D、2D 和 3D 数组)或 Memory<T>
实例。 此类型旨在与 Span2D<T>
类型一起使用,其方式与 Memory<T>
和 Span<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
实例可以映射到的几个缓冲区类型的示例:
- 一个 1D
T[]
数组,按行优先顺序映射为 2D 内存区域。 - 一个 2D
T[,]
数组,直接映射到Memory2D<T>
实例。 - 一个 3D
T[,,]
数组,其中Memory2D<T>
实例表示给定的深度切片(层)。
Memory<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>
类型的段落。
示例
可以在单元测试中查找更多示例。