메모리 구조

C++의 메모리 구조는 크게 4가지 영역으로 나눌 수 있습니다.

MemoryLoayout-MemoryLoayout

각 영역은 서로 다른 용도와 메모리 관리 방식을 가집니다.
효율적인 메모리 사용과 성능 최적화에 매우 중요하므로 이해할 필요가 있습니다.

C++ 프로그램은 실제 메모리 외에도 가상 메모리를 사용합니다.
운영 체제가 프로세스별로 독립된 메모리 주소 공간을 제공하기 때문에 메모리 충돌 없이 프로그램이 실행됩니다.

코드 영역

코드 영역(Code/Text Segment)는 프로그램의 실행 코드(컴파일된 명령어)가 저장되는 영역입니다.
CPU에서는 해당 영역에 저장된 명령어를 하나씩 가져가서 처리합니다.

일반적으로 코드가 수정되지 않도록 읽기 전용으로 보호됩니다.
실행 파일의 텍스트 섹션(.text)에 해당합니다.

프로세스마다 하나씩 존재하며, 공유 라이브러리의 경우 여러 프로세스가 공유할 수 있습니다.

메모리 크기는 컴파일 시 고정됩니다.

함수와 메서드의 명령어 등이 저장됩니다.

void func() { /* 실행 코드 */ }

데이터 영역

데이터 영역(Data Segment)는 프로그램 시작 시 메모리에 올라가는 전역 변수와 정적 변수가 저장되는 영역입니다.

초기화 된 데이터 영역과 초기화되지 않은 데이터 영역(BSS)로 나뉩니다.

초기화 된 데이터 영역은 초기값이 지정된 전역 혹은 정적 변수가 저장됩니다.

int value = 10;

초기화되지 않은 데이터 영역에는 초기값이 없는 전역 혹은 정적 변수가 저장됩니다.
이 영역의 데이터는 프로그램이 시작되기 전에 OS 커널에 의해 0으로 초기화 됩니다.

프로그램의 실행시 할당되며, 프로그램 종료시까지 메모리에 유지됩니다.
메모리의 크기가 고정되어있으며, 동적으로 변경되지 않습니다.

static int globalValue;

힙 영역

힙 영역(Heap Segment)은 프로그래머가 직접 관리하는 동적 메모리 할당이 이루어지는 영역입니다.

new또는 malloc 등을 통해 메모리를 할당하고, delete 또는 free로 메모리를 해제합니다.
메모리를 필요한 만큼 요청해 사용할 수 있으며, 메모리를 해제하지 않으면 메모리 누수가 발생합니다.

메모리가 낮은 주소에서 높은 주소의 방향으로 할당됩니다.

스택보다 상대적으로 접근 속도가 느립니다.

int* p = new int[10];
delete p;

스택 영역

스택 영역(Stack Segment)은 함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소 등을 저장합니다.
이렇게 스택에 저장되는 함수의 호출 정보를 스택 프레임이라고 합니다.

LIFO(Last-In-First-Out)구조를 가집니다.

함수가 호출될 때 메모리가 할당되고, 호출이 끝나면 자동으로 해제됩니다.
메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

메모리 크기가 몇 MB로 크기가 작아 제한적이며, 제한된 크기를 넘어 사용하면 스택 오버플로우가 발생할 수 있습니다.

접근 속도가 빠릅니다.

Date:     Updated:

카테고리:

태그:

Cpp 카테고리 내 다른 글 보러가기

댓글남기기