Поделиться через


Память2D<T>

Это Memory2D<T> тип, который отражает функциональность Memory<T> типа, с отличием, что может использоваться для представления 2D-расположений памяти. Он очень гибкий и способен упаковать ряд различных типов, включая массивы ND (с явной поддержкой 1D, 2D и трехмерных массивов) или 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-массив, сопоставленный как область памяти 2D T[] в основном порядке строк.
  • Массив 2D T[,] , сопоставленный непосредственно с экземпляром Memory2D<T> .
  • Трехмерный T[,,] массив с экземпляром Memory2D<T> , представляющим заданный срез глубины (слой).

Тип Memory<T> также предоставляет ряд служебных методов, включая большую часть той же поверхности API, что и стандартная Memory<T> реализация. Например, он включает Slice(int, int) метод, который упрощает выполнение операций срезов 2D непосредственно в расположении виртуальной 2D-памяти, при Memory2D<T> этом экземпляр автоматически настраивает необходимые параметры внутренне, чтобы переместить его сопоставление в правой области памяти, соответствующей запрошенным результатам.

Синтаксис

Вот как создать Memory2D<T> экземпляр из массива 2D:

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>

Memory2D<T> ТипReadOnlyMemory2D<T>, который ReadOnlyMemory<T> требуетсяMemory<T>. Он предоставляет те же точные функциональные возможности (минус API,которые включают изменение содержимого области памяти в оболочке) и предоставляют представление только для чтения в произвольные расположения памяти 2D. Дополнительные сведения о том, как работает этот тип, см. в абзаце выше.Memory2D<T>

Примеры

Дополнительные примеры можно найти в модульных тестах.