굉장히 빠른 메모리 할당...방법입니다.
정확하게 표현하면 새로 할당한다기보단, 동적 지역 변수(?)라고나 할까요.
아시는 분들은 다 아실 겁니다 -_-;

이렇게 메모리를 할당 받으면 이러한 특징이 있습니다.
1. 힙에서 새 공간을 찾는게 아니라 스택에 마련된 공간을 이용하므로 실질적인 메모리 할당 비용이 들지 않습니다.
2. 지역변수와 같기 때문에 메모리를 해제할 필요가 없고, 해제할 수도 없습니다. (함수가 끝나면 자동 소멸됩니다.)
3. 지역변수와 같기 때문에 포인터를 리턴해서는 안 됩니다.


할당 자체는 굉장히 빠르지만 (실제로 할당하는게 아니고 메모리 풀 같은 원리지만 할당이라고 하겠습니다.)
함수가 끝나면 자동 소멸되므로 사용할 수 있는 범위가 굉장히 제한되어 있습니다.
그러면 이런 메모리 할당은 어디에 쓸까요?

1. 함수 안에서만 쓸 거지만, 메모리 크기가 항상 고정적이지 않을 때.
예)
단순히 유니코드 API를 래핑하기 위해서 문자열을 유니코드로 바꾸기 위해 MultiByteToWideChar 같은 API를 쓸 때.

...기타 비슷한 경우...


잠깐만 쓰고 버릴 버퍼가 필요할 때 유용하게 쓸 수 있습니다.


그럼 어떻게 해야 그런 메모리를 할당받을 수 있을까요.

C나 C++에선 다음과 같은 함수가 있습니다.
[code]
void * _alloca( size_t size ); // malloc.h
[/code]

표준 함수는 아니기 때문에 _가 붙어있는데, 사실 함수가 아니라 매크로라고 합니다.
스택에 할당받기 때문에 범위가 지역인데, 함수를 호출하면 _alloca가 끝나면서 사라질테니 말이죠.


위 함수를 쓸 때 조심해야 할 점이 몇 가지 있습니다.
함수에 스택 프레임이 만들어져있지 않을 때 쓰면 스택이 망가집니다.
특히, 최적화로 스택 프레임이 만들어지지 않거나, 인라인 함수같은 경우 문제가 생길 수도 있습니다.
(Visual C++의 경우는, _alloca 함수가 있으면 강제로 스택 프레임을 만들고 인라인 확장을 안 하는 것 같습니다만...)

여튼 뭐 잘 쓰면 좋고 잘못 쓰면 안 좋은-_-; 함수입니다.


C#에도 비슷한 것이 있습니다.
이것은 연산자기 때문에, 사용법이 new와 비슷합니다.
[code]
...
int *p = stackalloc int[100];
...
[/code]
포인터를 써야 하기 때문에 unsafe 컨텍스트가 필요하다고 하긴 합니다.