Share via


Memory2D<T>

형식 Memory2D<T> 의 기능을 Memory<T> 미러 형식이며, 2D 메모리 위치를 나타내는 데 사용할 수 있다는 차이점이 있습니다. 매우 유연하며 ND 배열(1D, 2D 및 3D 배열에 대한 명시적 지원 포함) 또는 Memory<T> 인스턴스를 포함하여 다양한 형식을 래핑할 수 있습니다. 이 형식은 .와 함께 사용되는 것과 동일한 방식으로 Memory<T> 형식과 Span2D<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 버퍼 형식의 몇 가지 예는 다음과 같습니다.

  • 행 주 순서로 2D T[] 메모리 영역으로 매핑되는 1D 배열입니다.
  • 인스턴스에 직접 매핑된 2D T[,] 배열입니다 Memory2D<T> .
  • 지정된 깊이 조각(레이어)을 Memory2D<T> 나타내는 인스턴스가 있는 3D T[,,] 배열입니다.

또한 이 형식은 Memory<T> 표준 Memory<T> 에서 구현하는 것과 동일한 대부분의 API 표면을 포함하여 여러 유틸리티 메서드를 노출합니다. 예를 들어 가상 2D 메모리 위치에서 직접 2D 조각화 작업을 쉽게 수행할 수 있도록 하는 메서드가 포함되어 Slice(int, int) 있으며 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> 참조할 수 있습니다.

예제

단위 테스트에서 더 많은 예제를 찾을 수 있습니다.