1. 스택은 얼마나 커질 수 있습니까? 프로세서/아키텍처/컴파일러에 종속적입니까?
스택의 크기는 플랫폼 와 운영 체제 프로세스에 할당 된 메모리에 메모리의 양에 의해 제한된다.
2. 함수/클래스 스택에서 사용할 수있는 메모리의 양과 오버플로를 방지하기 위해 현재 사용중인 메모리 양을 정확하게 알 수있는 방법이 있습니까?
사용 가능한 메모리 양을 결정하는 C 또는 C++ 기능은 없습니다. 이를위한 플랫폼 특정 기능이있을 수 있습니다. 일반적으로 대부분의 프로그램은 메모리 할당을 시도한 다음 할당 실패시 해결 방법을 제안합니다.
3. 최신 컴퓨터 (예 : 6GB RAM)에서 현대 컴파일러 (예 : gcc 4.5)를 사용하면 스택 오버플로가 걱정 되나요? 아니면 과거의 일입니까?
스택 오버플로는 프로그램의 디자인에 따라 발생할 수 있습니다. 재귀는 메모리 양에 관계없이 스택을 고갈시키는 좋은 예입니다.
실제 RAM 또는 CPU 캐시에 실제 스택 메모리가 있습니까?
플랫폼에 따라 다릅니다. 일부 CPU는 스택의 로컬 변수를 사용하여 캐시를로드 할 수 있습니다. 이 주제에 대한 다양한 시나리오. 언어 사양에 정의되지 않았습니다.
5. 스택 메모리 액세스 및 읽기 속도가 힙 액세스 및 읽기 속도보다 빨라 집니까?
시간은 PC에 따라 다르므로 비율은 충분합니다.
전체적으로 속도에는 차이가 없습니다. 플랫폼이 메모리를 (물리적으로) 구성하는 방법과 실행 파일의 메모리가 배치되는 방법에 따라 다릅니다. 힙 또는 스택은 직렬 액세스 메모리 칩 (느린 방법) 또는 플래시 메모리 칩에 상주 할 수 있습니다. 언어 사양에 지정되지 않았습니다.
6. 큰 용기/개체를 스택에 할당하는 것은 좋지 않다고 읽었습니다. 얼마가 너무 큽니까? 이 질문은 win32에서 쓰레드에 대한 1MB의 답이 주어진다. Linux amd64의 스레드는 어떻습니까?
가장 좋은 조언은 필요에 따라 로컬 작은 변수를 할당하는 것입니다 (스택을 통해 a.k.a.). 거대한 항목은 동적 메모리 (a.k.a 힙) 또는 일종의 전역 변수 (정적 로컬 함수 또는 로컬 변환 단위 또는 전역 변수) 중 하나입니다. 컴파일 타임에 크기를 알고 있으면 전역 유형 할당을 사용하십시오. 런타임 동안 크기가 변경 될 수있는 경우 동적 메모리를 사용하십시오.
스택에는 함수 주소에 대한 정보도 들어 있습니다. 이것이 많은 객체를 로컬에 할당하지 않는 주된 이유 중 하나입니다. 일부 컴파일러는 힙 또는 전역 변수보다 스택에 대한 제한이 더 적습니다. 전제는 중첩 된 함수 호출이 대형 데이터 배열이나 버퍼보다 적은 메모리를 필요로한다는 것입니다.
스레드 또는 작업을 전환 할 때 OS가 상태를 어딘가에 저장해야한다는 것을 기억하십시오. OS는 스택 메모리를 다른 유형과 비교하여 저장하기위한 다른 규칙을 가질 수 있습니다.
이것은 좀 더 집중된 질문으로 나눌 수 있다고 생각합니다. –
단일 답변에서 다루기에는 너무 광범위합니다. 실제로는 10 개의 완전히 별개의 질문입니다. – littleadv
어떻게해야합니까? 몇 가지 질문을하고 다른 실에서 질문하십시오. –