C/C++에서 메모리에 올라가는 프로그램의 구조는 크게 스택, 힙, 데이터, 텍스트 영역으로 나뉜다. 이에 대해 정리한 내용이다.
프로그램의 실제 코드가 저장되는 영역이다.
전역 변수나 정적 변수가 저장되는 메모리 영역이다. 크게 데이터 영역과 BSS 영역으로 나뉜다.
Data 영역은 초기화된 데이터 영역(Initialized Data Segment)이라고도 불리며, "프로그래머가" 초기화한 전역 변수, 정적 변수가 저장된다.
Data 영역은 "초기화된 읽기 영역"과 "초기화된 읽기-쓰기 영역"으로 나뉜다.
예를 들어, 전역 변수로 선언한
const char* str = "hello world"
라는 코드에서,
"hello world"
라는 문자열 리터럴은const
로 선언되어 초기화된 읽기 영역에 저장된다.
포인터 변수str
은 읽기-쓰기 영역에 저장된다.
BSS 영역은 Block Started by Symbol의 약자로, 초기화되지 않은 전역 변수나 정적 변수가 저장된다. 프로그램 실행 전에 커널에 의해 0으로 초기화된다.
int x = 10; // Data segment memory
int y; // BSS segment memory
int main(){
int a = 10; // stack memory
}
스택(Stack) 영역은 함수의 호출과 관계되어 있는 데이터들이 저장되는 영역이다.
힙(heap) 영역은 동적 할당이 이루어지는 영역이다.
new/new[]
키워드를 통해 동적 할당을 하고, delete/delete[]
키워드를 통해 해제한다.Stack | Heap | |
---|---|---|
메모리 구성 | 연속적임(LIFO) | 할당 내에 연속적임. 할당 간의 단편화 발생(가상머신에 따라 차이) |
최대 크기 | 리눅스(8MB), 윈도우(1MB) | 메모리 시스템 전체 |
메모리 초과시 | 함수 호출 시 프로그램 크래시 | 예외 or nullptr |
할당 | 컴파일타임 | 런타임 |
지역성 | 높음 | 낮음 |
스레드 관점 | 각 스레드가 스텍 공간을 각각 차지함 | 스레드끼리 공유함 |
.
.
.
C++ 공부를 위해 작성된 글입니다. 오류가 있다면 지적해 주시면 감사하겠습니다.
참고자료
https://github.com/federico-busato/Modern-CPP-Programming (05.Basic_Concepts_IV)