Memory2D<T>
Memory2D<T>
2D 메모리 위치를 나타내는 데 사용할 수 있다는 차이점과 함께 형식의 Memory<T>
기능을 미러링하는 형식입니다. 매우 유연하며 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>
나타내는 인스턴스가 있는 3DT[,,]
배열입니다.
또한 이 형식은 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>
참조할 수 있습니다.
예제
단위 테스트에서 더 많은 예제를 찾을 수 있습니다.
.NET Community Toolkit