문제

누구든지 실제로 사용한 사람이 있습니다 stackalloc C#로 프로그래밍하는 동안? 나는 무엇을하는지 알고 있지만, 내 코드에 나타나는 유일한 시간은 우연한 것입니다. Intellisense는 타이핑을 시작할 때 그것을 제안하기 때문입니다. static, 예를 들어.

사용 시나리오와 관련이 없지만 stackalloc, 나는 실제로 내 앱에서 상당한 양의 레거시 인터 로프를 수행하므로 지금은 매번 사용하는 데 의지 할 수 있습니다. unsafe 암호. 그럼에도 불구하고 나는 보통 피할 방법을 찾습니다 unsafe 완전히.

.NET의 단일 스레드의 스택 크기는 ~ 1MB이므로 (내가 틀렸다면 수정) stackalloc.

"이것은 정확히 적절한 양의 데이터와 처리가 안전하지 않고 사용하기위한 처리입니다. stackalloc"?

도움이 되었습니까?

해결책

사용해야 할 유일한 이유 stackalloc 성능 (계산 또는 인터 로프). 사용하여 stackalloc 힙 할당 배열 대신 GC 압력을 적게 만듭니다 (GC는 더 적게 실행해야 함), 배열을 아래로 고정 할 필요가 없으며 힙 배열보다 더 빠르게 할당하는 것이 더 빠르며 메소드 출구에서 자동으로 해제됩니다 ( 할당 된 배열은 GC가 실행될 때만 할당됩니다). 또한 사용함으로써 stackalloc 기본 할당 자 (Malloc 또는 .NET 등가) 대신 스코프 출구에서 속도 및 자동 거래 위치를 얻습니다.

사용하는 경우 성능 현명합니다 stackalloc 데이터의 위치로 인해 CPU에서 캐시 적중 가능성을 크게 증가시킵니다.

다른 팁

StackAlloc을 사용하여 실시간 DSP 작업에 대한 버퍼를 할당했습니다. 성능이 가능한 한 일관성이 필요한 것은 매우 구체적인 경우였습니다. 일관성과 전체 처리량 사이에는 차이가 있습니다.이 경우 프로그램의 해당 시점에서 쓰레기 수집의 비 결정론만으로는 힙 할당이 너무 느리다는 점에 관심이 없었습니다. 나는 99%의 경우에 그것을 사용하지 않을 것입니다.

stackalloc 안전하지 않은 코드에만 관련이 있습니다. 관리 코드의 경우 데이터를 할당 할 위치를 결정할 수 없습니다. 값 유형은 기본적으로 스택에 할당됩니다 (참조 유형의 일부가 아니라면 힙에 할당됩니다). 참조 유형은 힙에 할당됩니다.

일반 바닐라 .NET 애플리케이션의 기본 스택 크기는 1MB이지만 PE 헤더에서이를 변경할 수 있습니다. 스레드를 명시 적으로 시작하는 경우 생성자 오버로드를 통해 다른 크기를 설정할 수도 있습니다. ASP.NET 응용 프로그램의 경우 기본 스택 크기는 256K에 불과하며, 이는 두 환경을 전환하는 경우 명심해야 할 사항입니다.

Spans의 STACKALLOC 초기화. C#의 이전 버전에서 STACKALLOC의 결과는 포인터 로컬 변수에만 저장 될 수 있습니다. C# 7.2 기준으로 STACKALLOC는 이제 표현식의 일부로 사용될 수 있으며 스팬을 타겟팅 할 수 있으며 안전하지 않은 키워드를 사용하지 않고 수행 할 수 있습니다. 따라서 글을 쓰는 대신

Span<byte> bytes;
unsafe
{
  byte* tmp = stackalloc byte[length];
  bytes = new Span<byte>(tmp, length);
}

간단히 쓸 수 있습니다.

Span<byte> bytes = stackalloc byte[length];

이것은 작업을 수행하기 위해 약간의 스크래치 공간이 필요한 상황에서 매우 유용하지만 비교적 작은 크기에 대한 힙 메모리를 할당하지 않기를 원합니다.

Span<byte> bytes = length <= 128 ? stackalloc byte[length] : new byte[length];
... // Code that operates on the Span<byte>

원천: C #- 스팬에 관한 모든 것 : 새로운 .NET 메인 스테이 탐색

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top