2013-07-09 1 views
2

8MB 스택으로 작업해야한다고 가정하고 표준 C++ 배열을 사용하고자합니다.
그것은전역 적으로 정의 된 변수에는 어떤 메모리가 사용됩니까?

const int MX = 10000; 
int DP[MX][MX]; 

int main() { 
    printf("%likB\n", (sizeof(DP))>>10); 
} 

이 힙 메모리를 사용하고, (DPmain에 선언 할 때 반대) 세그 폴트하지 않는 이유 것으로, 사실인가요? new/malloc을 통해 main에 메모리를 할당하는 것과 다릅니다 (free 이외의 문제)?

답변

5

는 실행에 사용되는 메모리는 (일반적으로) 오 개 별개의 섹션으로 나뉩니다

  • 또한 히스테리 역사적인 이유로 리눅스/유닉스 시스템에서 text로 알려진 코드 섹션 (). 이것은 당신의 기능이 "살아있는"곳입니다. 종종 char *s = "Hello, World";과 같은 상수 값에도 사용되며 "Hello, World!" 파트는 CODE 섹션에 저장됩니다.

  • "초기화 된"데이터 섹션 ("데이터"라고도 함) - 값이 지정된 글로벌 (C 및 C++ 용어로 정적) 데이터. int x = 42;

  • 초기화되지 않은 데이터 (BSS라고도 함) - 값이 주어지지 않아서 0으로 초기화 된 글로벌 데이터. 글로벌 컨텍스트에서 int y;이거나 static int status;이이 섹션에 속합니다.

위 섹션은 모두 실행 파일에 정의되어 있습니다. 일부 실행 파일에는이 섹션보다 많은 섹션이 있지만 "일반"실행 파일입니다. "추가"섹션의 예는 "코드"섹션에 저장하는 대신 문자열 데이터를 저장하는 데 사용할 수있는 "읽기 전용 데이터"섹션입니다. 실행 파일이로드되면

, 둘 개 이상의 섹션이 OS에 의해 생성된다 :

  • 함수 내부 로컬 변수들을 저장하는데 사용되며, 또한로 "돌아"하는 데 사용되는 스택 호출 함수. 스택은 일반적으로 크기가 상당히 제한되어 있지만 이전에는 사용하지 못했던 크기가 거의 없습니다. 요즘에는 스택이 "수 메가 바이트"크기의 범위입니다. 내가 사용한 첫 번째 머신에는 256 바이트의 스택이 있습니다 (하드 코딩 된 것입니다). 그 이상을 원한다면 자신의 소프트웨어 정의 스택을 만들어서 정리해야합니다. 별로 즐겁지 않다!

  • 힙. 이것은 "동적 할당"을 위해 사용됩니다 - 예를 들어 프로그램 입력에 따라 크기가 다른 배열에 대한 저장소를 생성 할 때 사용됩니다. 프로그램이 실행되기 전에 힙의 내용을 알 수 없습니다. 현대 시스템에서 힙은 작은 크기에서 시작하여 커지도록 허용됩니다 (하지만 시스템 자체가 메모리가 부족한 경우에는 제한 사항이 있지만 한계는 시스템 구성의 한계보다 낮을 수 있음) , 한 응용 프로그램이 컴퓨터의 모든 메모리를 다 사용하지 못하도록).

위의 예에서 DP은 "초기화되지 않은 데이터"섹션에 있습니다.

1

DP를 저장하는 static memory를 사용하고 메모리를 관리 할 필요없이, 기본적으로 동일 동적으로 new/malloc()에 할당 입니다.

+4

아니요! 그것은 힙이나 스택과 다른 정적 저장소 ("zero initialized data segment", BSS, 또는 당신이 그것을 호출하기를 원하는 것)를 사용합니다. –

+0

@MatsPetersson 동의; 업데이트되었습니다. – trojanfoe

+0

@MatsPetersson Thx. BSS의 존재에 대해 배우는 것이 좋다 ... –

1

힙 메모리가 아닌 전역 메모리를 사용하며 OS가 시작할 때 미리 할당됩니다. 함수에 국한되지 않기 때문에 스택의 크기는 무의미합니다.

0

C++에서 사용자 메모리는 힙, 스택 및 정적 (const 포함)의 세 섹션으로 나뉩니다. 일반적으로 전역 변수는 정적 섹션에 있습니다. 배열의 메모리는 정의 될 때 할당되기 때문에 정적 섹션에도 있다고 생각합니다. 게다가 힙에 전역 배열을 할당하는 방법에 대한 기사를 찾을 수 없습니다. 다른 사람이 그것을 찾으면, 나에게 @를 줘. 현대 OS 년대

관련 문제