본문 바로가기
Development/C++

데이터(data), 스택(stack), 힙(heap) 영역

by KingCat 2013. 12. 11.

실행중인 프로그램은 메모리가 할당된다. 이 메모리 공간의 종류는 데이터 영역, 스택 영역, 힙 영역이 있다.


데이터 : 전역변수 (프로그램 시작 후 메모리 공간에 올라가서 종료시까지 존재)를 위한 영역

            Static변수 (프로그램 시작과 동시에 메모리 공간에 올라가서 종료시까지 존재)를 위한 영역

 


스택(Stack)은 지역변수, 매개변수 같은 컴파일 타임에 크기가 결정되는 메모리를 올리는 공간이다. 여기서 컴파일 타임에 크기가 결정된다는 점에 주목하자.


예를 들어 배열을 선언할 경우 int arr[10];

이런식의 선언은 컴파일때 40바이트라는 크기가 결정되기 때문에 Stack에 올라간다. 


int a = 4; 이 경우 int 형 4바이트가 크기로 선언되고, 4라는 값이 들어가는 부분은 런타임시 결정된다.


즉, int arr[a]; 이런식의 선언은 a에 어떤 값이 들어갈지는 런타임시 결정되므로 컴파일 에러가 발생하는 것이다.


동적인 배열을 선언하기 위해서는 int* arr = new int[10]; 이런식으로 선언 및 정의하게 되는데, 런타임시 int형이 10개 만큼인 메모리가 할당되도록 결정된다. 이때 메모리는 힙(Heap)에 올라가게 된다.


힙(Heap)은 동적할당된 요소들이 올라가는 공간이다. 런타임시 크기가 결정되는 메모리들이 올라가고, 위의 동적할당에서 알 수 있듯이 메모리를 생성하고 포인터가 반환된다. 즉, 크기가 얼마나 생성될지 컴파일 타임에는 알 수 없기 때문에 포인터 자료형을 만들어놓고, 실제 생성 후 그 주소를 반환하는 것이다.


여기서 C++와 C#의 다른 점을 찾을 수 있다.


C++에서 Stack과 Heap은 설명시 Stack은 지역변수, 매개변수가 저장된다. Heap은 동적할당된 메모리가 저장된다. 라고 설명하고, C#은 Stack은 값 타입이 저장되고, Heap은 참조 타입이 저장된다.라고 설명한다.


같은 이야기인데, 결국 지역변수, 매개변수라고 설명한 것들은 컴파일 타임에 크기가 정해지고, 선언시 크기가 확정되는 변수들을 말하고, 이들을 값 타입이라고 설명하는 것이다. 


동적 할당된 메모리라는건 결국 선언시 크기가 확정되지 않은 상태의 포인터를 가지고 있는 변수를 말하고, C#에서는 이를 참조 타입이라고 설명한다.





'Development > C++' 카테고리의 다른 글

함수 오버라이딩(overriding)과 오버로딩(overloading)  (0) 2013.12.11
virtual  (0) 2013.12.11
[STL] vector에서 size(), reserve() 함수의 역할  (0) 2013.12.11
복사생성자와 복사 대입 연산자  (0) 2013.12.11
STL이란? (1)  (0) 2011.11.03