stackalloc(C# 참조)
업데이트: 2007년 11월
stackalloc 키워드는 안전하지 않은 코드 컨텍스트에서 스택에 메모리 블록을 할당하는 데 사용됩니다.
int* fib = stackalloc int[100];
설명
다음 예제에서는 피보나치 수열의 숫자 100개를 출력합니다. 이때 각 숫자는 이전 두 숫자의 합입니다. 이 코드에서 int 형식의 요소 100개를 포함하는 데 충분한 크기의 메모리 블록은 힙이 아니라 스택에 할당됩니다. 블록의 주소는 포인터 fib에 저장됩니다. 이 메모리는 가비지 수집의 영향을 받지 않으므로 fixed를 사용하여 고정하지 않아도 됩니다. 메모리 블록의 수명은 해당 메모리 블록이 정의된 메서드의 수명에 따라 제한됩니다. 즉, 메서드에서 반환하기 전에는 메모리를 해제할 수 없습니다.
stackalloc은 지역 변수 초기 값에서만 유효합니다.
포인터 형식이 관련되기 때문에 stackalloc에는 unsafe 컨텍스트가 필요합니다. 자세한 내용은 안전하지 않은 코드 및 포인터(C# 프로그래밍 가이드)를 참조하십시오.
stackalloc는 C 런타임 라이브러리의 _alloca와 비슷합니다.
보안
안전하지 않은 코드는 안전한 코드보다 위험합니다. 그러나 stackalloc을 사용하면 CLR(공용 언어 런타임)에서 버퍼 오버런 감지 기능이 자동으로 활성화됩니다. 버퍼 오버런을 감지하면 프로세스가 가능한 한 신속하게 종료되어 악의적인 코드가 실행될 가능성을 최소화합니다.
예제
class Test
{
static unsafe void Main()
{
const int arraySize = 20;
int* fib = stackalloc int[arraySize];
int* p = fib;
*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 - 1; ++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
*/
C# 언어 사양
자세한 내용은 C# 언어 사양에서 다음 단원을 참조하십시오.
- 18.8 스택 할당
참고 항목
개념
참조
안전하지 않은 코드 및 포인터(C# 프로그래밍 가이드)