stackalloc(C# 참조)
stackalloc 키워드는 안전하지 않은 코드 컨텍스트에서 스택에 메모리 블록을 할당하는 데 사용됩니다.
int* block = stackalloc int[100];
설명
키워드는 지역 변수 이니셜라이저에서만 유효합니다. 다음 코드는 컴파일러 오류를 발생시킵니다.
int* block;
// The following assignment statement causes compiler errors. You
// can use stackalloc only when declaring and initializing a local
// variable.
block = stackalloc int[100];
포인터 형식이 관련되기 때문에 stackalloc에는 unsafe 컨텍스트가 필요합니다. 자세한 내용은 안전하지 않은 코드 및 포인터(C# 프로그래밍 가이드)을 참조하십시오.
stackalloc는 C 런타임 라이브러리의 _alloca와 비슷합니다.
다음 예제는 피보나치 수열의 20번째 숫자까지 계산 및 표시합니다. 각 번호에는 이전 두 숫자의 합계입니다. 이 코드에서 int 형식의 요소 100개를 포함하는 데 충분한 크기의 메모리 블록은 힙이 아니라 스택에 할당됩니다. 블록의 주소는 포인터 fib에 저장됩니다. 이 메모리는 가비지 수집의 영향을 받지 않으므로 fixed를 사용하여 고정하지 않아도 됩니다. 메모리 블록의 수명은 해당 메모리 블록이 정의된 메서드의 수명에 따라 제한됩니다. 즉, 메서드에서 반환하기 전에는 메모리를 해제할 수 없습니다.
예제
class Test
{
static unsafe void Main()
{
const int arraySize = 20;
int* fib = stackalloc int[arraySize];
int* p = fib;
// The sequence begins with 1, 1.
*p++ = *p++ = 1;
for (int i = 2; i < arraySize; ++i, ++p)
{
// Sum the previous two numbers.
*p = p[-1] + p[-2];
}
for (int i = 0; i < arraySize; ++i)
{
Console.WriteLine(fib[i]);
}
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/*
Output
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
*/
보안
안전하지 않은 코드는 안전한 코드보다 위험합니다. 그러나 stackalloc을 사용하면 CLR(공용 언어 런타임)에서 버퍼 오버런 감지 기능이 자동으로 활성화됩니다. 버퍼 오버런을 감지하면 프로세스가 가능한 한 신속하게 종료되어 악의적인 코드가 실행될 가능성을 최소화합니다.
C# 언어 사양
자세한 내용은 C# 언어 사양을 참조하십시오. 이 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.
참고 항목
참조
안전하지 않은 코드 및 포인터(C# 프로그래밍 가이드)