C++

스택, 힙, 코드, 데이터 영역

종황이 2020. 10. 23. 15:23

OS에서 프로세스가 바라보는 메모리 영역은 크게 코드(Code), 데이터(Data), 힙(Heap), 스택(stack) 영역으로 나눠집니다.

 

 

Code 영역

 

프로세스가 실행할 코드와 매크로 상수가 기계어의 형태로 저장된 공간입니다. 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정되어있습니다. text 영역이라고도 합니다.

 

Data 영역

 

코드에서 선언한 전역변수 또는 static 변수 등등이 저장된 공간입니다. 전역변수/static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가리키도록 바뀝니다. 실행 중도에 전역변수가 변경 될 수도 있으니 이 영역은 Read-Write로 지정되어있습니다.

 

단, 초기화 되지 않는 전역 변수는 BSS(Block Stated Symbol) 영역에 할당됩니다.

 

Stack 영역 

 

자료구조로 많이 알려진 Stack은 프로세스의 메모리 공간을 관리하기 위한 알고리즘중 하나입니다. 이 영역은 함수 안에서 선언된 지역변수, 매개변수, 리턴값, 돌아올 주소 등등이 저장되고 함수 호출시 기록하고 종료되면 제거합니다. 기록하고 종료하는 메커니즘은 자료구조에서 배운 후위선출(LIFO) 방식을 따릅니다. 

 

컴파일 타임에 크기가 결정되기 때문에 무한히 할당 할 수 없습니다. 재귀함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러가 발생합니다.

 

Heap 영역

 

프로그래머가 필요할 때마다 사용하는 메모리 영역입니다. Code, Data, Stack 영역과는 다르게 Heap은 런타임에 결정됩니다. 프로그래머는 malloc, new로 Heap 영역의 메모리를 사용할 수 있습니다. 데이터 배열의 크기가 확실하지 않고 변동이 있을 때 Heap 영역을 활용해서 메모리를 할당합니다. 단 사용하고 난 다음에는 반드시 해제를 해야 합니다. 안그러면 memory leak이 발생한다.

 

스택보다 할당할 수 있는 메모리 공간이 많다는 것이 장점이지만 포인터로 메모리 영역을 접근해야 하기 때문에 다른 자료구조에 비해서 데이터를 읽고 쓰는게 느립니다. 

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

상속 (Inheritance)  (0) 2020.10.27
C++ 에서의 캐스팅(형변환)  (0) 2020.10.27
연산자 오버로딩(전위/후위 증감 연산자)  (0) 2020.10.27
malloc과 new의 차이  (0) 2020.10.24
참조자(레퍼런스)  (0) 2020.10.23