프로그램의 C / C ++ 최대 스택 크기 노드를 나타냄)

100 X 100 어레이에서 DFS를 수행하고 싶습니다. (배열의 요소는 그래프 노드를 나타냄) 따라서 최악의 경우를 가정하면 재귀 함수 호출의 깊이는 각 호출이 최대 20 바이트를 차지할 때 최대 10000까지 올라갈 수 있습니다. 그렇다면 스택 오버플로의 가능성이 있다는 것이 가능한 수단입니까?

C / C ++에서 스택의 최대 크기는 얼마입니까?

1) Windows의 cygwin
2) Unix 에 대해 gcc를 지정하십시오.

일반적인 제한은 무엇입니까?



답변

Visual Studio에서 기본 스택 크기는 1MB라고 생각하므로 재귀 깊이가 10,000이면 각 스택 프레임이 최대 ~ 100 바이트가 될 수 있으며 DFS 알고리즘에 충분합니다.

Visual Studio를 포함한 대부분의 컴파일러를 사용하여 스택 크기를 지정할 수 있습니다. 일부 (모두?) Linux 버전에서 스택 크기는 실행 파일의 일부가 아니라 OS의 환경 변수입니다. 그런 다음으로 스택 크기를 확인하고 ulimit -s예를 들어를 사용하여 새 값으로 설정할 수 ulimit -s 16384있습니다.

다음 은 gcc의 기본 스택 크기에 대한 링크 입니다.

재귀없는 DFS :

std::stack<Node> dfs;
dfs.push(start);
do {
    Node top = dfs.top();
    if (top is what we are looking for) {
       break;
    }
    dfs.pop();
    for (outgoing nodes from top) {
        dfs.push(outgoing node);
    }
} while (!dfs.empty())

답변

스레드 스택은 종종 더 작습니다. 링크 타임에 기본값을 변경하거나 런타임에도 변경할 수 있습니다. 참고로 일부 기본값은 다음과 같습니다.

  • glibc i386, x86_64 7.4MB
  • Tru64 5.1 5.2MB
  • Cygwin 1.8MB
  • Solaris 7..10 1MB
  • MacOS X 10.5 460KB
  • AIX 5 98KB
  • OpenBSD 4.0 64KB
  • HP-UX 11 16KB

답변

플랫폼 의존적, 도구 체인 의존적, ulimit 의존적, 매개 변수 의존적 …. 그것은 전혀 지정되지 않았으며 영향을 줄 수있는 많은 정적 및 동적 속성이 있습니다.


답변

예, 스택 오버플로의 가능성이 있습니다. C 및 C ++ 표준은 스택 깊이와 같은 것을 지시하지 않으며 일반적으로 환경 문제입니다.

대부분의 적절한 개발 환경 및 / 또는 운영 체제를 사용하면 링크 또는로드 시간에 프로세스의 스택 크기를 조정할 수 있습니다.

보다 구체적인 지원을 위해 사용중인 OS 및 개발 환경을 지정해야합니다.

예를 들어 Ubuntu Karmic Koala에서 gcc의 기본값은 2M 예약 및 4K 커밋이지만 프로그램을 연결할 때 변경할 수 있습니다. 이를 수행하려면의 --stack옵션을 사용하십시오 ld.


답변

방금 직장에서 스택이 부족했고 데이터베이스 였고 일부 스레드를 실행 중이었습니다. 기본적으로 이전 개발자가 스택에 큰 배열을 던졌고 스택은 어쨌든 낮았습니다. 이 소프트웨어는 Microsoft Visual Studio 2015를 사용하여 컴파일되었습니다.

쓰레드는 스택이 부족했지만 조용히 실패하고 계속해서 스택에있는 데이터의 내용에 액세스 할 때만 스택 오버플로가 발생했습니다.

내가 줄 수있는 가장 좋은 조언은 스택에서 배열을 선언하지 않는 것입니다. 특히 복잡한 애플리케이션, 특히 스레드에서 대신 힙을 사용하십시오. 그것이 거기에있는 것입니다;)

또한 스택을 선언 할 때 즉시 실패하지 않고 액세스 할 때만 실패 할 수 있음을 명심하십시오. 내 생각 엔 컴파일러가 “낙관적으로”윈도우 아래에서 스택을 선언한다는 것입니다. 즉, 스택이 선언되었고 스택을 사용할 때까지 충분히 크기가 조정되었다고 가정하고 스택이 거기에 없다는 것을 알게됩니다.

운영 체제마다 스택 선언 정책이 다를 수 있습니다. 이 정책이 무엇인지 아는 경우 의견을 남겨주세요.


답변

직사각형 배열에서 깊이 우선 검색을 수행하는 것이 무엇을 의미하는지 잘 모르겠지만 수행중인 작업을 알고 있다고 가정합니다.

스택 한계가 문제라면 재귀 솔루션을 힙에서 할당 된 스택에 중간 값을 푸시하는 반복 솔루션으로 변환 할 수 있어야합니다.