Memory2D<T>

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 实例可以映射到的几个缓冲区类型的示例:

  • 一个 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> 类型的段落。

示例

可以在单元测试中查找更多示例。