본문 바로가기
프로그래밍 언어/C, C++의 기본적인 설명

[C/C++] 힙(Heap), 스택(Stack)

by UltraLowTemp-Physics 2021. 8. 17.
728x90

메모리 구조

프로그램이 운영체제로부터 할당받는 메모리 공간은 크게 아래와 같이 4가지이다. 

영역 설명
코드
(Code)
• 실행한 프로그램의 코드가 저장되는 영역 
• 텍스트 영역이라고 부르기도 함 
• CPU가 코드 영역에 저장된 명령어를 하나씩 처리함 
데이터
(Data)
• 프로그램의 전역 변수와 정적 변수가 저장되는 영역 
• 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸함 

(Heap)
• 사용자가 직접 관리할 수 있는 메모리 영역 
• 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨 
• 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됨 
스택
(Stack)
• 함수의 호출과 관계있는 지역 변수와 매개변수가 저장되는 영역 
• 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸함 
• 스택 영역에서 데이터를 저장/인출하는 방식 
  - 푸시(Push)  동작으로 데이터 저장 
  - 팝(Pop) 동작으로 데이터 인출 
  - 후입 선출 (LIFO, Last-In First-Out) 방식으로 동작 
  - 가장 늦게 저장된 데이터가 가장 먼저 인출됨 
• 스택 영역은 메모리의 높은 주소부터 낮은 주소의 방향으로 할당됨 

 

NOTE: 프로그램 스택 
- 함수의 실행을 지원하기 위한 메모리 영역 
- 일반적으로 힙과 메모리 영역을 공유함 
   -- 공유된 메모리 영역에서, 스택은 메모리의 낮은 부분을 사용하는 경항이 있고, 힙은 메모리의 높은 부분을 사용하느 경향이 있음 
- 프로그램 스택은 스택 프래임*을 포함하고 있음 
- 함수가 호출될 시, 함수의 스택 프레임이 스택에 추가(push)되며, 입력된 스택은 위쪽으로 자란다. 그리고 함수가 종료될 때, 함수의 스택 프레임이 프로그램 스택에서 제거(pop)된다.
- 스택 프레임에 의해 사용된 메모리는 초기화되지 않으며, 다른 스택 프레임이 스택에 입력될 때, 덮어진다. 
   

* 스택 프래임
  - 활성화 레코드 또는 활성화 프레임이라 부르기도 함 
  - 함수 호출 시 전달되는 매개변수와 로컬 변수를 포함함 
  - 스텍 프레임의 구성 
     a. 반환 주소: 함수 종료후 돌아가야 할 프로그램 내의 주소 
     b. 로컬 변수 저장소: 로컬 변수를 위해 할당된 메모리 
     c. 매개변수 저장소: 함수의 매개변수를 위해 할당된 메모리 
     d. 스택 포인터와 기반 포인터(base pointer): 스택 관리 목적으로 런타임 시스템에서 사용되는 포인터 
       -- 스텍 포인터: 일반적으로 스택의 제일 높은 위치를 가리킴 
       -- 스택 기반 포인터:
             --- 반환 주소 같은 스텍 프레임 안에 있는 주소를 가리킴
             --- 스택 프레임 요소들의 접근을 도와줌 
       NOTE: 스택 포인터와 스택 기반 포인터는 C 포인터가 아니며, 프로그램 스택을 관리하는 런타임 시스템에서 사용하는 주소 

NOTE: 힙은 동적 메모리를 관리함 

 

 

힙과 스택의 장단점

  장점 단점

(Heap)
• 전역적으로 엑세스 할 수 있음 
• 메모리 크기 제한 없음
• 상대적으로 느린 엑세스 
• 효율적인 공간 사용을 보장하지 못하면, 메모리 블록이 할당된 후, 시간이 지남에 따라 메모리가 조각화되어 해제될 수 있음 
• 메모리를 사용자가 직접 관리해야하는 책임이 있음 
  (메모리의 할당 및 해제) 
스택
(Stack)
• 매우 빠른 엑세스 
• 변수를 명시적으로 할당 해제할 필요 없음 
• 스택 공간은 CPU에 의해 효율적으로 관리 
• 지역변수만 
• 스택 크기 제한 (OS에 따라 다름)
• 변수의 크기를 조정할 수 없음

 

 

 

 

728x90

댓글