IT이야기

SPAN의 차이점

cyworld 2021. 10. 18. 21:03
반응형

스팬의 차이점은 무엇입니까 및 메모리 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

반응형