스팬의 차이점은 무엇입니까 및 메모리 C# 7.2에서?
C # 7.2을 소개합니다이 개 새로운 유형 : Span<T>
와 Memory<T>
같은 이전의 C # 형식을 통해 더 나은 성능을 가지고 string[]
.
질문: Span<T>
와 의 차이점은 무엇입니까 Memory<T>
? 왜 하나를 다른 것보다 사용할까요?
Span<T>
Memory<T>
힙에 존재할 수 있지만 본질적으로 스택 전용입니다 .
Span<T>
T[]와 동등한 성능 특성으로 임의 메모리의 연속 영역을 나타내기 위해 플랫폼에 추가하는 새로운 유형입니다. API는 배열과 유사하지만 배열과 달리 관리 또는 기본 메모리 또는 스택에 할당된 메모리를 가리킬 수 있습니다.
Memory <T>
보완하는 유형Span<T>
입니다. 설계 문서에서 논의한 바와 같이Span<T>
스택 전용 유형입니다. 의 스택 전용 특성으로Span<T>
인해Span<T>
비동기 호출을 수행하는 루틴과 같이 힙에 버퍼( 로 표시 )에 대한 참조를 저장해야 하는 많은 시나리오에 적합하지 않습니다 .
async Task DoSomethingAsync(Span<byte> buffer) {
buffer[0] = 0;
await Something(); // Oops! The stack unwinds here, but the buffer below
// cannot survive the continuation.
buffer[0] = 1;
}
이 문제를 해결하기 위해 우리는
Span <T>
임의의 메모리 범위를 나타내는 범용 교환 유형으로 사용하기 위한 보완 유형 세트를 제공할 것이지만Span <T>
이러한 유형 과 달리 스택 전용이 아니라 상당한 비용이 듭니다. 메모리 읽기 및 쓰기 성능 저하.
async Task DoSomethingAsync(Memory<byte> buffer) {
buffer.Span[0] = 0;
await Something(); // The stack unwinds here, but it's OK as Memory<T> is
// just like any other type.
buffer.Span[0] = 1;
}
위의 샘플에서
Memory <byte>
는 버퍼를 나타내는 데 사용됩니다. 이것은 일반 유형이며 비동기 호출을 수행하는 메소드에서 사용할 수 있습니다. 해당 Span 속성은 를 반환Span<byte>
하지만 반환된 값은 비동기 호출 중에 힙에 저장되지 않고 값에서 새 값이 생성됩니다Memory<T>
. 어떤 의미에서Memory<T>
의 공장입니다Span<T>
.
참조 문서: 여기
re: 스택에 할당된 메모리만 가리킬 수 있음을 의미합니다.
Span<T>
스택이나 힙에 할당된 모든 메모리를 가리킬 수 있습니다. 스택 전용 특성 Span<T>
것을 의미 Span<T>
자체가 (안 메모리가 가리키는)에만 스택에 있어야합니다. 이는 스택이나 힙에 상주할 수 있는 "일반" C# 구조체와 대조적입니다(값 형식 박싱을 통해 또는 클래스/참조 형식에 포함된 경우). 보다 분명한 실용적인 의미 중 일부는 Span<T>
클래스에 필드를 가질 수 없고 box Span<T>
할 수 없으며 배열을 만들 수 없다는 것입니다.
Memory<T>
의 안전하지 않지만 보다 다양한 버전으로 볼 수 있습니다 Span<T>
. Memory<T>
해제된 배열을 가리키는 경우 개체 에 대한 액세스 가 실패합니다.
ReferenceURL : https://stackoverflow.com/questions/47321691/what-is-the-difference-between-spant-and-memoryt-in-c-sharp-7-2
'IT이야기' 카테고리의 다른 글
여러 페이지에서 탐색 모음을 재사용하려면 (0) | 2021.10.18 |
---|---|
Docker는 종료된 컨테이너의 로그를 봅니다. (0) | 2021.10.18 |
캔버스 중앙에 맞추기 (0) | 2021.10.18 |
8진수를 사용할 때 잘못된 토큰 (0) | 2021.10.18 |
Android의 파일 시스템 (0) | 2021.10.18 |