C에서 스택을 얼마나 쓰는지 알아내기
GCC의 링커를 쓸 경우 스택의 크기는 다음과 같이 설정할 수 있다.
cc -Wl,--stack,8388608 ...
그런데 재귀호출을 구현하다 보면 스택의 크기를 얼마로 잡아야 할지 애매할 때가 있다. C에서는 재귀함수 내 변수의 메모리 주소를 이용해서 증가하는 스택의 크기를 확인할 수 있다.
#include <stdio.h>
#include <stdlib.h>
static void *stack_top, *stack_bottom;
static void func(int);
int main(int argc, char *argv[])
{
stack_top = (void *)&argc;
func(argc == 1 ? 0 : atoi(argv[1]));
printf("Stack usage: %ld\n", stack_top - stack_bottom);
}
static void func(int n)
{
stack_bottom = (void *)&n;
if (n > 0)
func(n - 1);
}
다음과 같이 실행해 보자.
$ ./stack_usage
Stack usage: 32 # 여기서 func() 함수를 한 번 호출하는데 32 바이트가 필요하다는 걸 알 수 있다.
$ ./stack_usage 100
Stack usage: 3232 # 추가적으로 100 번을 더 호출하면 최초 32 + 32 * 100 = 3232 바이트가 필요하다.