[C++] C++의 메모리 모델

HY K·2024년 8월 27일

명품 C++ 프로그래밍

목록 보기
16/24

C++에서의 메모리 모델은 프로그램이 실행될 때 사용하는 메모리를 구분하여, 효율적으로 관리하는데 중요한 역할을 한다. 이번 포스팅에서는 C++의 메모리 모델에 대해서 공부해볼 것이다.


1. 스택 메모리(Stack Memory)

스택 메모리는 함수 호출 시 자동으로 할당되고, 해제되는 메모리 영역이다. 지역 변수(local variable)와 함수 인자(parameter)들이 저장되는 공간으로써, LIFO(Last In, First Out, 후입선출) 방식으로 관리가 이루어지는 공간이다.

  • 컴파일러에 의해서 스택에 메모리가 자동으로 할당되고, 자동으로 해제된다.
  • 스택 메모리 영역은 할당과 해제 속도가 매우 빠르다는 특징을 가지고 있다.
  • 메모리 크기가 한정적이라, 매우 큰 데이터나, 매우 많은 빈도의 재귀 호출 시 스택 오버플로우(stack overflow) 문제가 발생 가능하다.

예시를 들면 다음과 같다.

void function(){
	int localVar = 10; // 스택 메모리에 할당
}

int main(){
	function(); // 함수 호출 시 스택 메모리에 지역 변수 할당
    return 0; // 함수 종료시 지역 변수 자동 해제
}

2. 힙 메모리(Heap Memory)

힙 메모리는, 동적 메모리 할당과 관련해서 사용하는 영역으로 프로그래머 혹은 개발자가 명시적으로 할당 및 해제를 관리해야 한다. 프로그램이 실행 중에 필요에 따라 메모리를 할당할 때 사용하는 영역이다.

  • 개발자가 new 키워드를 통해서 수동으로 할당하고, 더 이상 사용하지 않을 때 delete 키워드를 통해서 해제한다. 스마트 포인터와 같은 도구를 사용한다면 자동으로 관리가 가능해진다.
  • 스택보다 크기가 크고, 더 많은 메모리를 안정적으로 저장 가능하다.
  • 스택보다 반응 속도가 더 느린다.

예시는 다음과 같다.

int main(){
	int* ptr = new int(20); // 힙 메모리에 정수형 변수 할당
    cout<<"*ptr<<endl;
    
    delete ptr; // 힙 메모리 해제
}

3. 데이터 세그먼트(Data Segment)

데이터 세그먼트는 전역 변수(global variable)와 static 변수의 메모리가 할당되는 영역이다. 이 영역은 초기화 된 영역과 초기화 되지 않은 영역으로 구분이 된다.

  • 초기화 된 데이터 영역(Initialized Data Segment) : 프로그램 시작 전에 초기화 된 전역 변수와 static 변수가 저장된다.
  • 초기화 되지 않은 데이터 영역(Uninitialized Data Segment) : 초기화 되지 않은 전역 변수와 static 변수가 저장되며, 프로그램 시작 시 자동으로 0으로 초기화 된다.
int globalVar = 10; // 초기화 된 전역 변수 (초기화 된 영역에 저장)
static int staticVar; // 초기화 되지 않은 영역에 저장

int main(){
	cout<<globalVar<<endl;
    cout<<staticVar<<endl; //0으로 자동 초기화 됨
}

4. 코드 세그먼트(Code Segment)

코드 세그먼트는 프로그램의 실행 코드(기계어)가 저장되는 메모리 영역이다. 보통 코드의 무결성을 보호하기 위해서 읽기 전용 영역으로 세팅되어있으며, 실행 중에 수정되지 않는다(그게 정상이니까).

int main(){
	int a = 5; // a의 할당은 스택 메모리에서 이루어짐
    return 0; // mnain 함수의 실행 코드는 코드 세그먼트 내부에 있다.
}
profile
로봇, 드론, SLAM, 제어 공학 초보

0개의 댓글