[C++]프로세스 메모리 구조와 정적/동적 할당

JUNYOUNG·2024년 11월 24일

CS 기초

목록 보기
5/6
post-thumbnail

C++는 메모리를 세밀하게 관리할 수 있는 강력한 도구를 제공한다.

이를 제대로 활용하려면 프로세스 메모리 구조를 이해하고, 정적 할당동적 할당의 차이를 명확히 알아야 한다.

컴퓨터에서 프로그램이 실행되면 운영체제는 프로세스에 필요한 메모리를 여러 영역으로 나눈다. 이 구조는 크게 네 가지로 구성된다:

  1. 스택(Stack): 지역 변수와 함수 호출 정보를 저장.
  2. 힙(Heap): 동적 할당된 데이터를 저장.
  3. 데이터 영역(Data Segment): 전역 변수와 static 변수를 저장.
  4. 코드 영역(Code Segment): 실행 코드를 저장.

C++에서 이 네 가지 영역은 메모리 최적화와 성능 개선에 중요한 역할을 한다.


1. 프로세스 메모리 구조

(1) 스택(Stack)

스택은 함수 호출 시 필요한 지역 변수와 매개변수를 저장한다.

함수가 호출될 때 스택에 데이터가 "쌓이고(push)", 함수가 종료되면 메모리가 "꺼내진다(pop)".

특징:

  • 컴파일 시 크기가 고정된다.
  • 함수 호출 시마다 새로운 스택 프레임이 생성된다.
  • 함수가 종료되면 메모리가 자동으로 해제된다.
  • 스택 오버플로우(Stack Overflow)가 발생할 수 있다.

예제:

void func() {
    int localVar = 10; // 스택에 저장
}

(2) 힙(Heap)

힙은 실행 중에 동적으로 메모리를 할당하는 영역이다.

newmalloc으로 메모리를 요청하며, 반드시 deletefree로 해제해야 한다.

특징:

  • 크기가 유동적이며 런타임에 결정된다.
  • 메모리를 직접 관리해야 한다.
  • 메모리 누수(Memory Leak)가 발생할 수 있다.

예제:

int* heapVar = new int(20); // 힙에 메모리 할당
delete heapVar;             // 메모리 해제

(3) 데이터 영역(Data Segment)

데이터 영역은 전역 변수와 static 변수를 저장한다.

초기화 여부에 따라 BSS 영역Data 영역으로 나뉜다.

  • BSS (Block Started by Symbol): 초기화되지 않은 변수 저장.
  • Data 영역: 초기화된 변수 저장.

특징:

  • 프로그램 시작 시 메모리가 할당되고 종료 시까지 유지된다.

예제:

int globalVar;           // BSS (초기화되지 않음)
int initializedVar = 42; // Data (초기화됨)
static int staticVar = 99; // Data

(4) 코드 영역(Code Segment)

코드 영역은 프로그램의 실행 코드를 저장한다.

컴파일러가 생성한 바이너리 코드가 저장되며, 읽기 전용(Read-Only)으로 설정된다.


2. 정적 할당과 동적 할당

C++에서 변수와 데이터는 정적 할당(Static Allocation)동적 할당(Dynamic Allocation) 두 가지 방식으로 메모리에 할당된다. 이를 이해하면 메모리를 효과적으로 관리하고, 성능과 안정성을 높일 수 있다.


(1) 정적 할당 (Static Allocation)

컴파일 단계에서 메모리를 할당하고, 프로그램 종료 시까지 유지된다.

데이터 영역(BSS, Data)이나 코드 영역에 저장된다.

특징:

  • 메모리 크기와 위치가 컴파일 시에 결정된다.
  • 전역 변수와 static 변수가 포함된다.
  • 명시적인 해제가 필요하지 않다.

예제:

int globalVar = 10;       // Data 영역
static int staticVar = 20; // Data 영역

(2) 동적 할당 (Dynamic Allocation)

프로그램 실행 중에 메모리를 할당하며, 주로 힙 메모리를 사용한다.

동적 할당된 메모리는 개발자가 명시적으로 해제해야 한다.

특징:

  • 크기와 수명을 런타임에 결정할 수 있다.
  • 잘못된 메모리 관리로 메모리 누수 발생 가능.

예제:

int* heapVar = new int(30); // 힙에 동적 할당
delete heapVar;             // 메모리 해제

3. C++에서의 메모리 관리 도구

C++는 메모리를 세밀하게 관리할 수 있는 다양한 도구를 제공한다.

대표적인 도구로는 스마트 포인터(Smart Pointer)가 있다.

스마트 포인터

스마트 포인터는 C++에서 동적 메모리를 자동으로 관리하기 위한 도구다.

std::unique_ptr, std::shared_ptr를 사용하면 메모리 누수를 방지할 수 있다.

예제:

#include <memory>int main() {
    std::unique_ptr<int> ptr = std::make_unique<int>(10); // 메모리 자동 해제
    return 0;
}

4. 정적 할당과 동적 할당의 장단점 비교

정리

  • 프로세스 메모리 구조는 C++의 메모리 관리에서 중요한 개념이다. 스택, 힙, 데이터 영역, 코드 영역 각각의 역할을 명확히 이해하면 효율적으로 메모리를 활용할 수 있다.
  • 정적 할당은 간단하고 안전하지만, 런타임 유연성이 부족하다. 반면, 동적 할당은 유연하지만, 메모리 누수와 같은 위험이 있다.
  • C++의 스마트 포인터는 동적 메모리를 안전하게 관리할 수 있는 도구로, 메모리 관리의 복잡성을 줄이는 데 유용하다.
profile
Onward, Always Upward - 기록은 성장의 증거

0개의 댓글