본문 바로가기
프로그래밍/C++

메모리 구조

by Nessie! 2022. 11. 22.

오늘은 메모리 구조에 대해 정리해보았다.

메모리라는 말은 누구나 여러번 들어보았을텐데, 오늘 알아볼 내용은 하드웨어 관련 내용은 아니고
우리가 프로그램을 실행시켰을 때 이 메모리에서 어떤 구조를 통해 실행되는지를 알아보려 한다.

기본적으로 C언어, C++ 등 언어들을 통해 코딩을 하고 빌드시키면 .exe파일이 생성되고
이 실행파일이 실행되면 해당 프로그램의 정보가 메모리에 로드되면서 파일이 작동하게 된다.

이때 메모리의 구조는 아래와 같이 구분된다.

 

1. 코드(code) 영역

2. 데이터(data) 영역

3. 스택(stack) 영역

4. 힙(heap) 영역

 

그림으로 표현하면 이렇게된다! 

위 그림의 출처는 http://www.tcpschool.com/c/c_memory_structure 여기당

 

그림만 보면 ? 싶다 ㅋㅋ

 

각 영역별로 간단하게 설명해보자면

 

코드(CODE) 영역

코드영역은 실행할 프로그램의 코드가 저장되는 영역이다.

여기에 저장된 명령어들을 CPU에서 하나씩 가져가서 처리를 한다고 보면 된다.

 

코드영역은 다른 게시글들을 보다보면 text영역이라고 부르는 경우도 더러 있는 것 같으니 참고하면 될 듯 하다.

 

 

데이터(DATA) 영역

데이터 영역은 프로그램의 전역 변수와 정적 변수가 저장되는 영역이다.

해당 영역은 프로그램의 사작과 함께 할당되며, 프로그램이 종료되면 소멸하는 특징이 있다.

따라서 전역 변수나 정적 변수의 변수주기는 프로그램 시작 -> 프로그램 종료 라고 볼 수 있다

그래서 잘못 사용하면 쓸데없이 메모리를 잡아먹고 있을 수 있으니 사용할때 조심할것! 자칫하면 메모리 누수가 될 수 있당

 

메모리 누수 뭔지 궁금하면 접은글을 참고하자!

더보기

메모리 누수란 프로그램이 작동하며 할당됐던 메모리가 더 이상 사용되지 않는 시점에서도 반환되지 않는 현상으로, 이게 누적되면 프로그램이 제대로 작동하지 않거나 크래시가 발생할 수 있다!

 

 

힙(HEAP) 영역

힙 영역은 쉽게 말하면 사용자가 관리하는 영역이라고 보면된다.

사용자는 런타임중에 변수들을 동적으로 할당할 수 있는데, 이때 동적으로 할당한 변수들이 저장되는 영역이라고 생각하면 된다. (동적할당을 했으면 해제까지 정확하게 해줘야한다)

그리고 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다고 한다.

 

자료구조의 힙과는 아무런 상관이 없다!

 

스택(STACK) 영역

스택 영역은 함수를 호출 할 때 지역변수, 매개변수들이 저장되는 공간이다.

그니까 함수를 호출했을 때 함수 내에 써둔 지역변수가 있다면 그 지역변수랑 함수 호출 시 사용하는 매개변수가 저장되는 영역이다.

 

즉, 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. (이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다)

 

따라서 함수의 종료가 되기 전에 본인을 재참조하는 재귀함수를 잘못 사용 할 경우 이 지역변수와 매개변수가 무한대로 쌓여버려서 Stack Overflow가 발생할 수 있다.

 

후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출

Stack영역은 Heap영역과 반대로 높은주소에서 낮은주소로 메모리에 할당된다.

 

 

또한, 메모리에는 주소라는 것이 있는데 할당되면 예쁘게 처음부터 차곡 차곡 쌓이는게 아니라 메모리 어딘가에 알아서 그만큼의 영역이 잡힌다. 따라서 주소를 통해 메모리를 관리할 수 밖에 없는데, 이는 포인터와 관련이 있다.

궁금하면 포인터 관련 포스팅을 참고바란다 ㅎㅎ

 

'프로그래밍 > C++' 카테고리의 다른 글

[정리] C++ 복합 데이터형  (0) 2022.11.30
[정리] C++ 데이터 처리  (0) 2022.11.30
[정리] C++ 시작하기  (0) 2022.11.21
컴파일(Compile)  (0) 2022.11.19
[C++] STL map 컨테이너  (0) 2022.10.25

댓글