2011-09-29 5 views
1

GCC를 사용합니다 (Windows 32, C 만, 기본 빌드 옵션).대부분의 로컬 크기는 로컬로 사용 가능합니다.

내 로컬 스택의 최대 크기는 무엇입니까? 예를 들어

가 :

는 코딩의 내 초기 일 동안 아마도 어떤 충격적인 경험에서
void myfunc (void) 
{ 
char is_this_too_big_for_a_local_var[64*1024*1024]; 

somefunc(is_this_too_big_for_a_local_var); 
} 

, 내가 이제까지 가장 16K 로컬 스토리지에 이상을 사용하려고 적이 .. (예, 습관 고른 286, 16bit 컴퓨터 시대).

어쨌든, 실제로는 큰 변수를 로컬에서 찾을 수 있습니까? 또는 약간 K 아직도 상한?

답변

3

시스템에 큰 스택이 있어도 사용하는 습관을 갖지 않아야합니다. 대형 스택 프레임을 사용하는 코드는 각 스레드의 스택이 가능한 가장 큰 스택 사용을 수용 할만큼 충분히 커야하기 때문에 멀티 스레드 프로그램에서 사용하는 즉시 문제가됩니다. 스레드를 만드는 코드는 pthread_attr_setstacksize (또는 이와 동등한) 가상 주소 공간을 더 많이 사용하지 않고 각 스레드에서 필요한 것보다 커밋을 피하십시오. 편집

: argv 복사, 주요의 시작 부분에서

  1. : 여기은 당신이 당신의 메인 쓰레드의 스택에 원하는 공간을 보장하기 위해 "휴대용"(POSIX 시스템에) 방법에 대한 아이디어 새로 할당 된 메모리로.
  2. 그런 다음 원하는 스택 크기로 새 스레드를 만들고 argv 사본을 전달하십시오. 원하는 크기를 사용할 수 없으면 오류가보고됩니다.
  3. 새 스레드에서 main을 새로 호출하고 argv을 다시 호출하지만 1/2 단계를 반복하지 않도록 전역 플래그가 설정되었습니다.
  4. pthread_exit 초기 "주 스레드"에서 새 스레드를 "주 스레드"로 취급하십시오.
관련 문제