C++에서의 메모리 모델은 프로그램이 실행될 때 사용하는 메모리를 구분하여, 효율적으로 관리하는데 중요한 역할을 한다. 이번 포스팅에서는 C++의 메모리 모델에 대해서 공부해볼 것이다.
스택 메모리는 함수 호출 시 자동으로 할당되고, 해제되는 메모리 영역이다. 지역 변수(local variable)와 함수 인자(parameter)들이 저장되는 공간으로써, LIFO(Last In, First Out, 후입선출) 방식으로 관리가 이루어지는 공간이다.
예시를 들면 다음과 같다.
void function(){
int localVar = 10; // 스택 메모리에 할당
}
int main(){
function(); // 함수 호출 시 스택 메모리에 지역 변수 할당
return 0; // 함수 종료시 지역 변수 자동 해제
}
힙 메모리는, 동적 메모리 할당과 관련해서 사용하는 영역으로 프로그래머 혹은 개발자가 명시적으로 할당 및 해제를 관리해야 한다. 프로그램이 실행 중에 필요에 따라 메모리를 할당할 때 사용하는 영역이다.
예시는 다음과 같다.
int main(){
int* ptr = new int(20); // 힙 메모리에 정수형 변수 할당
cout<<"*ptr<<endl;
delete ptr; // 힙 메모리 해제
}
데이터 세그먼트는 전역 변수(global variable)와 static 변수의 메모리가 할당되는 영역이다. 이 영역은 초기화 된 영역과 초기화 되지 않은 영역으로 구분이 된다.
int globalVar = 10; // 초기화 된 전역 변수 (초기화 된 영역에 저장)
static int staticVar; // 초기화 되지 않은 영역에 저장
int main(){
cout<<globalVar<<endl;
cout<<staticVar<<endl; //0으로 자동 초기화 됨
}
코드 세그먼트는 프로그램의 실행 코드(기계어)가 저장되는 메모리 영역이다. 보통 코드의 무결성을 보호하기 위해서 읽기 전용 영역으로 세팅되어있으며, 실행 중에 수정되지 않는다(그게 정상이니까).
int main(){
int a = 5; // a의 할당은 스택 메모리에서 이루어짐
return 0; // mnain 함수의 실행 코드는 코드 세그먼트 내부에 있다.
}