본문 바로가기

C++

C++ 배우기 11(메모리 구조)

포인터를 배우기 전에 우선 메모리 구조에 대해서 알아보려고 한다.

저번에도 말했듯이 게임에서 중요한 것은 최적화라고 했다. 그 최적화를 잘하기 위해 우선 메모리 구조에 대해

알아둘 필요가 있다.


메모리

메모리는 프로그램이 기억해야 하는 것들을 저장하는 곳이다.

때문에 프로그램이 실행되기 위해서는 먼저 메모리에 로드(Load)되어야 한다.

그리고 프로그램에서 사용되는 변수들을 저장할 수 있는 메모리도 필요하다.

 

그래서 컴퓨터의 운영체제는 프로그램 실행을 위해 다양한 메모리 공간을 제공해준다.

거기서 할당받는 메모리 영역에는 여러 가지가 있는데, 대표적인 메모리 공간은 아래와 같다.

메모리 공간


코드(Code) 영역

코드 영역은 우리가 실행한 프로그램의 소스코드가 저장되는 영역으로 텍스트 영역이라고도 부른다.

컴파일 타임에 필요한 메모리들을 올려놓는 공간이라고 할 수 있다.

코드 영역에는 실행파일을 구성하는 코드, 함수, 제어문, 매크로, 리터럴 상수 등과 같은 명령어들을 가져가서 처리한다.

위와 같은 명령어들은 수정되거나 변경되어서는 안 되기 때문에 (Read Only) 읽는 것만 가능한 영역이다.

※ 매크로 : #define callname 변수

 

 

 

데이터(Data) 영역

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

프로그램의 시작과 함께 할당이 되고, 종료되면 소멸한다.

더 자세한 내용은 다음에 확인하도록 하겠다.

 

 

 

스택(Stack) 영역

스택 영역은 호출한 함수와 연관된 지역변수와 매개변수를 저장하는 영역이다.

따라서 함수의 호출과 동시에 스택 영역이 할당되고, 호출이 완료될 때 소멸한다.

input 또는 output(반환 값), 매개변수, 지역변수들이 처리되는 곳이다.

이렇게 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.

 

스택 프레임(stack frame)

함수가 호출되어 매개변수, 지역변수, 주소값 등이 차례대로 저장되는 호출 정보를 말한다.

이곳에는 들어오는 값이 순서대로 아래에서부터 차곡차곡 쌓이게 되는데, 이러한 특징 때문에

종료될 때는 가장 마지막에 들어온 값부터 차례대로 빠져나가야 한다.

 

그래서 스택 영역은 후입 선출(LIFO, Last-in First-Out) 방식으로 동작하는데,

가장 늦게 저장된 데이터가 제일 먼저 인출된다는 뜻이다.

반대되는 말로는 선입 선출(FIFO, First-in First-Out) 방식이란 것도 있으니 알아두자.

 

스택 영역의 크기는 예약 크기가 1MB로 작다. 그래서 들어오는 값들의 크기를 가늠할 수 있어야

사용할 수 있는데, 때문에 정적 할당의 특징도 있다. 그래서 배열의 크기가 미리 지정되지 않고는

사용할 수 없는 것이다. (또는 배열의 크기가 너무 크게 지정되는 것도 문제이다.)

 

여담으로, 할당에는 정적 할당과 동적 할당, 두 가지가 있다. 정적 할당은 컴파일 타임 때 결정이 되고,

동적 할당은 런타임 때 결정이 되는 특징을 가지고 있다.

 

 

 

힙(Heap) 영역

힙 영역은 사용자가 직접 할당 / 해제할 수 있는 메모리 영역이다.

스택 영역과는 반대로 동적 할당의 특징을 가지고 있다.

또한 스택이 안 쓰는 나머지 공간을 사용을 해서 크기가 비교적 크다.

그래서 넓은 공간에 접근하기 위해서는 메모리 주소값으로 접근을 해야 하는데,

바로 이 주소값을 다루기 위해서 나중에 포인터를 배워야 한다.

 

 

스택 영역이 안 쓰는 공간을 쓴다고 했듯이, 힙 영역은 스택 영역과 같은 공간을 공유한다.

그래서 스택 영역이 커질수록 힙 영역이 작아지고, 반대로 힙 영역이 커질수록 스택 영역이 작아지게 된다.

때문에 어느 한쪽이 너무 커져서 상대 공간에 넘어가는 일을 힙 오버플로(Heap overflow), 스택 오버플로(stack overflow)라고 한다.


참고자료

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

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

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/

 

[컴퓨터 기초] 메모리구조(Memory Structure) - jinShine

프로그램 실행 순서 메모리 영역에 관해 이야기하기 전에 어떤식으로 프러그램이 실행되는지 과정을 살펴 보겠습니다. 프로그램의 정보를 읽어 메모리에 로드되는 과정을 보실 수 있으실텐데,

jinshine.github.io

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

C++ 배우기 13(메모리 관리)  (0) 2022.10.31
C++ 배우기 12(포인터)  (0) 2022.10.28
C++ 배우기 10(2차원배열)  (0) 2022.10.25
C++ 배우기 9(함수)  (0) 2022.10.24
C++ 배우기 8(ASCII코드, 문자열, 구조체)  (0) 2022.10.20