C++

[C++] 메모리 구조

wnstjd 2023. 10. 26. 10:25

왜 알아야 할까

메모리는 프로그램이 실행되며 그에 맞게 할당된다. 할당된 메모리는 한정되어 있기 때문에 잘 관리해 주지 않고 너무 많은 양을 사용하게 되면 프로그램의 속도가 느려지거나 뻗어버린다. 프로그램의텐츠가 아무리 좋아도 메모리 관리가 잘 안돼서 실행이 원활히 되지 않으면 사용자 입장에서는 그냥 쓰레기가 되는 거다. 따라서 개발자는 메모리 관리를 신경 써야 하고 잘 하기 위해서는 메모리 구조를 알아야 하는 것이다.

 

 

 

프로그램 실행 및 작동 원리

메모리 구조를 그냥 외우기 보다는 프로그램의 작동 원리를 이해한다면 메모리 구조를 이해하기 쉬워진다.

 

프로그램 작동 원리는 이렇다.

  1. 사용자가 운영체제에 프로그램 실행을 요청한다.
  2. 운영체제는 하드디스크에 저장된 프로그램을 읽어 메모리의 코드 영역에 저장한다.
  3. CPU는 메모리의 코드 영역을 읽어 전역 변수, 정적 변수를 저장할 데이터 영역을 할당하고 프로그램을 실행한다.
  4. 프로그램이 작동되며 실행되는 함수의 매개 변수, 지역 변수, 복귀 주소 등이 스택 영역에 할당된다.
  5.  프로그래머가 동적으로 생성하고 해제하는 변수들이 힙 영역에 할당된다.

https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/

 

 

 

메모리 영역

https://www.tcpschool.com/c/c_memory_structure

  • 코드 영역 : 프로그램의 코드가 저장되는 영역이다. CPU가 이 영역을 읽어 프로그램을 실행한다. 
  • 데이터 영역 : 프로그램의 정적 변수, 전역 변수가 저장되는 영역이다. 프로그램이 종료되면 해제된다.
  • 힙 영역 : 프로그램에서 개발자가 동적으로 할당하고 해제하는 동적 변수가 저장된다. 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다. 힙 영역이 커질수록 스택 영역이 작아진다.
  • 스택 영역 : 프로그램이 작동하며 실행되는 함수의 매개 변수, 지역 변수, 반환 주소값 등이 저장된다. 함수가 종료되면 해제된다. 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다. 스택 영역이 커질수록 힙 영역이 작아진다.

 

 

 

메모리 누수

개발자가 동적 변수를 할당하고 쓸모없어지는 시점에서 해제하지 않아 메모리가 낭비되는 것을 말한다.

메모리 누수가 쌓이면 메모리 자원 반환이 원활이 되지 않아 여러 버그가 발생하거나 프로그램이 종료될 수 있다.

 

 

 

오버플로우

힙 영역이 스택 영역을 침범했거나 스택 영역이 힙 영역을 침범했을 때 발생하는 에러이다.

각각의 경우를 힙 오버플로우, 스택 오버플로우라고 부른다.