2009-03-25 4 views
2

특정 컴파일러/os 콤보에 대한 최대 스택 크기를 찾는 방법에 대해 궁금합니다. 우분투/GNU 컴파일러를 사용하고 있습니다. 내가 가지고있는 몇 가지 질문은 다음과 같습니다.리눅스에서 C++ 프로그램의 메모리 스택 최대 크기를 어떻게 알 수 있습니까? (GNU 컴파일러)

  1. 누가 기본 최대 스택 크기를 제어합니까? OS 또는 컴파일러?
  2. 총 메모리에 따라 기본 최대 값이 조정됩니까? (즉, 2GB 메모리를 가진 머신은 512MB를 가진 머신보다 더 큰 기본 사이즈를 가질 것입니다.)이 예제에서 두 머신은 동일한 OS/컴파일러 설정이며, 시스템 RAM의 양이 다릅니다.

고마워요!

답변

6

누가 기본 최대 스택 크기를 제어합니까? OS 또는 컴파일러?

일반적으로 컴파일러입니다. OS/하드웨어는이를 어느 정도 제한합니다. Linux IIRC에서는 기본값이 8MB입니다. Linux에서 ulimit -s을 생각해보십시오 (스택 크기를 변경하려면).

총 메모리에 따라 기본 최대 값이 조정됩니까? (즉, 2GB 메모리를 가진 머신은 512MB를 가진 머신보다 더 큰 기본 사이즈를 가질 것입니다.)이 예제에서 두 머신은 동일한 OS/컴파일러 설정이며, 시스템 RAM의 양이 다릅니다.

아니오 yilurself를 사용하지 않는 한. 컴파일러 스위치를 통해 스택 크기를 변경할 수 있습니다.

ld --stack=<STACK_SIZE> 

또는

gcc -Wl,--stack=<STACK_SIZE> 

스택 및 힙의 문제에 C++ 표준의 의견 :

표준은 추상 기계에 따라 정말하지 않는 문제 자체에있다

하드웨어 또는 스택 또는 힙. 할당 된 상점 및 무료 스토어에 대해 이야기합니다. 무료 스토어는 새로운 (주로) 전화를하는 경우에 당신이 될 곳입니다. FWIW, 구현은 객체 할당과 관련하여 스택과 힙으로 위장하는 단 하나의 메모리 영역 만 가질 수 있습니다.

귀하의 질문은 언어 문제가 아니라 구현 관련 문제로 귀결됩니다.

희망이 도움이됩니다.

+0

내가 너를 업 그레 이드 할 수 있다면. 이것은 대단히 도움이되었습니다, 설명해 주셔서 감사합니다. – RyanY

+0

upvoting에 대해 걱정하지 마십시오. 도와 줄 수있어서 기뻐. 추가 질문이 있으면 알려주십시오. – dirkgently

+0

--stack =에 대한 대답의 일부가 완전히 잘못되었습니다. 여기에 'info ld'가 말한 내용이 있습니다 :이 옵션은 링커의 i386 PE 대상 포트에만 적용됩니다. UNIX 시스템에서 컴파일러는 일반적으로 스택 제한과 관련하여 * 아무것도 * 없습니다. –

0

C++ 표준에는 실제로 스택이 필요하지 않습니다.이 방법은 이식성이 없습니다.

+0

지금은 매우 혼란 스럽습니다. 저는 스택이 C++ 메모리의 필수 영역이라고 생각했습니다. C++ 프로그램이 스택없이 어떻게 작동하는지 설명해 주시겠습니까? 고맙습니다. – RyanY

+0

C++ 표준은 구현에 아무런 부담을주지 않습니다. 할당 된 상점과 무료 상점에 대해서만 이야기합니다. 무료 저장소에서 물건을 얻으려면 새로운 작업을해야하며 그렇지 않으면 할당 된 저장소에서 대체 작업을 수행해야합니다. – dirkgently

+0

컴파일러는 CPU 레지스터 (일명 스택)에 의해 인덱싱 된 메모리 블록이 아닌 호출 프레임의 링크 된 목록을 사용할 수 있습니다. 필자가 알고있는 모든 구현은 후자를 사용하지만 C++ 표준에서는 필요하지 않습니다. –

3

Linux (Ubuntu)에서 운영 체제가 최대 크기를 제어합니다. 참고로 "man limit"또는 "man ulimit"을 참조하십시오.

2

요즘 정확한 질문입니다 : 얼마나 많은 메모리가 내 스레드에 할당되어 있습니다. 각 스레드는 일반적으로 스레드 생성시 제어 할 수있는 양을 가져옵니다.

일부 운영 체제 (역사적으로) 한계가 있지만 1 부에 대해 컴파일러/스레드 시스템이 선택됩니다.

2의 경우 배율을 조정하지 않습니다.

관련 문제