Compartir a través de


Memory2D<T>

Memory2D<T> es un tipo que refleja la funcionalidad del tipo Memory<T>, con la diferencia de que se puede usar para representar ubicaciones de memoria 2D. Es extremadamente flexible y es capaz de ajustar una serie de tipos diferentes, incluidas matrices ND (con compatibilidad explícita con matrices 1D, 2D y 3D) o instancias Memory<T>. Este tipo está diseñado para usarse junto con el tipo Span2D<T>, de la misma manera que Memory<T> se usa junto con Span<T>. Para obtener más información sobre las diferencias clave y los escenarios de casos de uso de estos dos tipos, puede leer esta página de documentos.

API de plataforma: Memory2D<T>, Span2D<T>, ReadOnlyMemory2D<T>

Funcionamiento

El tipo Memory2D<T> realiza un seguimiento interno del área de memoria 2D asignada a través de una referencia al objeto ajustado, los parámetros de alto y ancho y un parámetro de inclinación especial. El alto y el ancho indican la longitud de las filas y columnas del área de memoria 2D, mientras que el tono indica el desplazamiento entre el final de cada fila y el inicio del siguiente.

Este es un diagrama sencillo que ilustra esta configuración (las celdas "XX" de la cuadrícula representan elementos que pertenecen al área de memoria 2D de destino):

//                _____________________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__/
// ...________/

Esta configuración permite a Memory2D<T> ser extremadamente flexible en la forma en que asigna los búferes existentes a las áreas de memoria 2D, ya que permite también representar búferes no ambiguos como una ubicación de memoria 2D "virtual". Por ejemplo, estos son algunos ejemplos de tipos de búfer a los que una instancia Memory2D puede asignar:

  • Matriz 1D T[] que se asigna como un área de memoria 2D en orden principal de fila.
  • Matriz 2D T[,], asignada directamente a una instancia de Memory2D<T>.
  • Matriz 3D T[,,], con una instancia Memory2D<T> que representa un segmento de profundidad determinado (una capa).

El tipo Memory<T> también expone una serie de métodos de utilidad, incluida la mayoría de la misma superficie de API que implementa el estándar Memory<T>. Por ejemplo, incluye un método Slice(int, int) que facilita las operaciones de segmentación 2D directamente en la ubicación de memoria 2D virtual, con la instancia Memory2D<T> ajustando automáticamente los parámetros necesarios internamente para desplazar su asignación en las áreas de memoria adecuadas correspondientes al resultado solicitado.

Sintaxis

Aquí se muestra cómo puede crear una instancia Memory2D<T> a partir de una matriz 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>

ReadOnlyMemory2D<T> es para el tipo Memory2D<T> lo mismo que ReadOnlyMemory<T> es para Memory<T>. Expone justo las mismas funcionalidades (menos las API que implican modificar el contenido del área de memoria ajustada) y proporciona una vista de solo lectura a ubicaciones de memoria 2D arbitrarias. Para obtener más información sobre cómo funciona este tipo, puede consultar el párrafo sobre el tipo Memory2D<T> antes.

Ejemplos

Encontrará más ejemplos en las pruebas unitarias.