2010-01-28 3 views
9

C에서 1024 바이트보다 큰 크기의 struct 변수를 선언했습니다. Coverity (정적 코드 분석기 응용 프로그램)를 실행하면이 스택 변수가 1024 바이트보다 커서 오류가 발생한다고보고합니다. 이 경고에 대해 걱정할 필요가 있는지 알고 싶습니다. 실제로 단일 스택 변수의 크기에 최대 제한이 있습니까?스택에 할당해야하는 변수의 크기에는 최대 한도가 있습니까?

감사 변수의 최대 크기는 스택 (최대 크기에 의해 제한된다

+0

Picking 1024는 완전히 임의적이며, 512 바이트 변수도 "오류의 원인"이 될 수 있습니다. 그리고 2048 바이트의 변수는 그 가능성을 두 배로 늘리지 않습니다. 이 충고를 1 파운드의 소금과 함께 섭취하십시오. –

답변

3

체 특히 높은 함수에서 변수 및 파라미터 포함하는 임의의 사용 전류로부터 위에 남은 스택 스택 및 프로세스 프레임 오버 헤드).

Windows에서 첫 번째 스레드의 스택 크기는 실행 파일 set during linking의 속성이며 스레드의 스택 크기는 thread creation 동안 지정할 수 있습니다.

유닉스에서 첫 번째 스레드의 스택 크기는 일반적으로 얼마나 많은 공간이 있는지에 의해서만 제한됩니다. 특정 리눅스가 메모리를 어떻게 배치하고 공유 객체를 사용하는지에 따라 달라질 수 있습니다. 스레드의 스택 크기는 thread creation 동안 지정할 수도 있습니다.

2

다른 실행 경로로 인해 스택 오버플로가 발생하여 테스트에서 찾을 수 없습니다. 대부분 이런 이유로 - 스택에 많은 양의 데이터를 할당하는 것은 나쁜 형식으로 간주됩니다. 당신은 임베디드 시스템에서 실제로 문제가 발생할 가능성이 큽니다.

즉, 스택에서 너무 많은 데이터를 고려하는 것에 대해 임의의 제한을 설정합니다.

2

예. 물론 그것은 시스템의 주소 공간에 의해 제한됩니다. 그것은 또한 OS에 의해 스택에 할당 된 공간의 양에 의해 제한됩니다. OS는 일반적으로 프로그램을 시작한 후에는 변경할 수 없지만 실행 프로세스 나 실행 파일의 속성에 따라 사전에 변경할 수 있습니다. 내 OS X 시스템의 최대 스택 크기는 8 MiB이고 Linux의 경우 10 MiB입니다. 어떤 시스템에서는 시작하는 각기 다른 스레드에 서로 다른 양의 스택을 할당 할 수 있습니다. 단, 유용성은 제한적입니다. 대부분의 컴파일러에는 단일 스택 프레임에서 허용 할 수있는 양에 대한 또 다른 제한이 있습니다.

현대적인 데스크톱에서는 함수가 재귀 적이 아닌 한 1k 스택 할당에 대해 걱정하지 않겠습니다. OS 커널 내부에서 사용하기 위해 임베디드 코드 또는 코드를 작성하는 경우 문제가 될 수 있습니다. Linux 커널의 코드는 구성 옵션에 따라 64KB 이상의 스택 만 허용됩니다.

+0

"일부 시스템에서는 시작할 때 각기 다른 스레드에 다른 양의 스택을 할당 할 수 있습니다. 단, 유용성은 제한적입니다." 기본값이 작은 시스템에서 유용합니다. 데스크탑 리눅스에서는 필요성을 느끼지 않지만 미리 할당 된 스택과 가상 메모리가없는 일부 임베디드 시스템에서는 유용합니다. –

0

함수가 (직접 또는 간접적으로) 재귀에 관련된 경우 스택에 많은 양을 할당하면 재귀 깊이가 제한되어 스택을 잘 날 수 있습니다. Windows에서이 스택 예약은 기본적으로 1MB이지만 링커 명령으로 정적으로 증가시킬 수 있습니다. 스택이 사용되면 커지지 만 운영 체제가 가끔 일 수 없으므로을 확장 할 수 없습니다. 내 웹 사이트 here에서 좀 더 자세하게 설명 드리겠습니다.

0

앞서 보았 듯이 C 컴파일러 (터보)는 변수에 최대 64000k 크기를 제공합니다. 더 많은 크기가 필요하다면 "거대한"것으로 선언됩니다.

+0

변수를 int [1000] [1000]으로 선언했을 때와 같은 메시지입니다. 컴파일러에서 "배열 크기가 너무 큽니다"라는 오류 메시지가 표시되었습니다. 내가 도움을봤을 때 주어진 메시지가있다. –

0

엄청난 양의 스택 공간을 사용하는 것은 좋지 않습니다. 여기

은 기본 gcc가 스택의 크기에 대한 링크입니다 : 또한 http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt

, 당신은 스택 크기를 사용자 정의 할 수 --stack,xxxxx을 지정할 수 있습니다, 그래서 xxxxx 작은 수를 가정하고 힙 할당을 고수하는 것이 가장 좋습니다.

관련 문제