Класс Memory2D<T>

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

Тип Memory2D<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);

// 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, you can also slice using a range:
Memory2D<int> test = memory[.., ..2];

// { 1, 2 }
// { 4, 5 }
// { 7, 8 }

Span2D<int> span = memory.Span;

// You 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, которые включают изменение содержимого завернутой области памяти) и предоставляет представление только для чтения в произвольные двухмерные расположения памяти. Дополнительные сведения о том, как работает этот тип, см. в предыдущем абзаце типа Memory2D<T> .

Примеры

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