Wednesday, April 30, 2008

alloca() : Allocating memory from the stack

스택은 프로그램의 자동변수들이 들어있는 공간이다. heap말고 이 스택에서 메모리를 할당받으려면 alloca()를 사용하면 된다. 스택에서 메모리를 할당받을 때의 장점은 별도의 메모리 해제가 필요없다는 것이다. 함수가 종료되면 메모리는 자동으로 해제된다. 왜? 스택에 있으니까. alloca()는 에러를 반환하지 않는다. 스택 메모리 할당의 실패는 stack overflow로 처리되기 때문이다. 아래와 같이 함수내에서 간단한 스트링 처리를 위해 사용하는 것이 일반적이다.

#include <alloca.h>

int func(const char* tail) {
const char *str = "temporal string";
char * fullstr;

fullstr = alloca(strlen(tail)+strlen(str)+1);
strcpy(fullstr, str);
strcat(fullstr, tail);

/* do something */

return 0;
}

주의할 사항은 이렇게 alloca로 할당된 메모리 영역을 함수 호출시에 인자로 사용해서는 안된다는 것이다. (다른 함수 호출시 alloca로 할당 받은 스택 영역은 push 되니까!) 그리고 alloca()는 그다지 portable하지 않으므로 사용에 주의할 필요가 있다. 그러나 메모리 해제가 필요 없다는 점, 할당시 malloc에 비해 오버헤드가 적다는 점에서 자주 사용할 수 있는 유용한 함수이다.

스트링을 스택 메모리에 복사해서 사용하는 경우도 있는데, 이를 위해서 Linux에서 제공하는 함수로 아래와 같은 것들이 있다(POSIX에서는 제공하지 않는다)

#define _GNU_SOURCE
#include <string.h>
char * strdupa(const char *s);
char * strndupa(const char *s, size_t n);

예상되다시피 스트링을 스택 메모리에 복사한 후 포인터를 넘겨준다.

No comments:

Post a Comment