C에서 1024 바이트보다 큰 크기의 struct 변수를 선언했습니다. Coverity (정적 코드 분석기 응용 프로그램)를 실행하면이 스택 변수가 1024 바이트보다 커서 오류가 발생한다고보고합니다. 이 경고에 대해 걱정할 필요가 있는지 알고 싶습니다. 실제로 단일 스택 변수의 크기에 최대 제한이 있습니까?스택에 할당해야하는 변수의 크기에는 최대 한도가 있습니까?
감사 변수의 최대 크기는 스택 (최대 크기에 의해 제한된다
C에서 1024 바이트보다 큰 크기의 struct 변수를 선언했습니다. Coverity (정적 코드 분석기 응용 프로그램)를 실행하면이 스택 변수가 1024 바이트보다 커서 오류가 발생한다고보고합니다. 이 경고에 대해 걱정할 필요가 있는지 알고 싶습니다. 실제로 단일 스택 변수의 크기에 최대 제한이 있습니까?스택에 할당해야하는 변수의 크기에는 최대 한도가 있습니까?
감사 변수의 최대 크기는 스택 (최대 크기에 의해 제한된다
체 특히 높은 함수에서 변수 및 파라미터 포함하는 임의의 사용 전류로부터 위에 남은 스택 스택 및 프로세스 프레임 오버 헤드).
Windows에서 첫 번째 스레드의 스택 크기는 실행 파일 set during linking의 속성이며 스레드의 스택 크기는 thread creation 동안 지정할 수 있습니다.
유닉스에서 첫 번째 스레드의 스택 크기는 일반적으로 얼마나 많은 공간이 있는지에 의해서만 제한됩니다. 특정 리눅스가 메모리를 어떻게 배치하고 공유 객체를 사용하는지에 따라 달라질 수 있습니다. 스레드의 스택 크기는 thread creation 동안 지정할 수도 있습니다.
다른 실행 경로로 인해 스택 오버플로가 발생하여 테스트에서 찾을 수 없습니다. 대부분 이런 이유로 - 스택에 많은 양의 데이터를 할당하는 것은 나쁜 형식으로 간주됩니다. 당신은 임베디드 시스템에서 실제로 문제가 발생할 가능성이 큽니다.
즉, 스택에서 너무 많은 데이터를 고려하는 것에 대해 임의의 제한을 설정합니다.
이 문서 http://www.embedded.com/columns/technicalinsights/47101892?_requestid=27362
예는 스택 크기에 대한 꽤 흥미 롭다 그것을 OS에 의존하고 가지 다른 의존. 너무 막연해서 미안해. 스택 크기를 테스트하기 위해 gcc 컬렉션에서 일부 코드를 파헤쳐 볼 수도 있습니다.
예. 물론 그것은 시스템의 주소 공간에 의해 제한됩니다. 그것은 또한 OS에 의해 스택에 할당 된 공간의 양에 의해 제한됩니다. OS는 일반적으로 프로그램을 시작한 후에는 변경할 수 없지만 실행 프로세스 나 실행 파일의 속성에 따라 사전에 변경할 수 있습니다. 내 OS X 시스템의 최대 스택 크기는 8 MiB이고 Linux의 경우 10 MiB입니다. 어떤 시스템에서는 시작하는 각기 다른 스레드에 서로 다른 양의 스택을 할당 할 수 있습니다. 단, 유용성은 제한적입니다. 대부분의 컴파일러에는 단일 스택 프레임에서 허용 할 수있는 양에 대한 또 다른 제한이 있습니다.
현대적인 데스크톱에서는 함수가 재귀 적이 아닌 한 1k 스택 할당에 대해 걱정하지 않겠습니다. OS 커널 내부에서 사용하기 위해 임베디드 코드 또는 코드를 작성하는 경우 문제가 될 수 있습니다. Linux 커널의 코드는 구성 옵션에 따라 64KB 이상의 스택 만 허용됩니다.
"일부 시스템에서는 시작할 때 각기 다른 스레드에 다른 양의 스택을 할당 할 수 있습니다. 단, 유용성은 제한적입니다." 기본값이 작은 시스템에서 유용합니다. 데스크탑 리눅스에서는 필요성을 느끼지 않지만 미리 할당 된 스택과 가상 메모리가없는 일부 임베디드 시스템에서는 유용합니다. –
함수가 (직접 또는 간접적으로) 재귀에 관련된 경우 스택에 많은 양을 할당하면 재귀 깊이가 제한되어 스택을 잘 날 수 있습니다. Windows에서이 스택 예약은 기본적으로 1MB이지만 링커 명령으로 정적으로 증가시킬 수 있습니다. 스택이 사용되면 커지지 만 운영 체제가 가끔 일 수 없으므로을 확장 할 수 없습니다. 내 웹 사이트 here에서 좀 더 자세하게 설명 드리겠습니다.
앞서 보았 듯이 C 컴파일러 (터보)는 변수에 최대 64000k 크기를 제공합니다. 더 많은 크기가 필요하다면 "거대한"것으로 선언됩니다.
변수를 int [1000] [1000]으로 선언했을 때와 같은 메시지입니다. 컴파일러에서 "배열 크기가 너무 큽니다"라는 오류 메시지가 표시되었습니다. 내가 도움을봤을 때 주어진 메시지가있다. –
엄청난 양의 스택 공간을 사용하는 것은 좋지 않습니다. 여기
은 기본 gcc가 스택의 크기에 대한 링크입니다 : 또한 http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt, 당신은 스택 크기를 사용자 정의 할 수 --stack,xxxxx
을 지정할 수 있습니다, 그래서 xxxxx
작은 수를 가정하고 힙 할당을 고수하는 것이 가장 좋습니다.
Picking 1024는 완전히 임의적이며, 512 바이트 변수도 "오류의 원인"이 될 수 있습니다. 그리고 2048 바이트의 변수는 그 가능성을 두 배로 늘리지 않습니다. 이 충고를 1 파운드의 소금과 함께 섭취하십시오. –