스택의 용량이 무제한이라면, 힙이 필요할까?

 

📌 스택과 힙 간단 비교

특징 스택
할당 방식 자동 ( 컴파일러가 관리 ) 수동 ( 프로그래머가 malloc / free 관리 )
메모리 크기 일반적으로 작음 상대적으로 큼
할당 속도 매우 빠름 상대적으로 느림
데이터 수명 함수 실행 동안만 유지 free() 호출 전까지 유지
사용 방식 지역 변수, 함수 호출 스택 동적 할당된 객체, 대량 데이터

 

스택이 무제한이라면, 할당 속도가 빠르고, 자동 해제되므로 힙을 대체할 수 있을것 처럼 보인다.

하지만, 다음과 같은 이유 때문에 여전히 힙이 필요하다.

 

1️⃣ 데이터의 수명이 함수 호출을 넘어야 하는 경우

스택 변수는 함수가 종료되면 자동으로 해제된다.

 

int* createNumber() {
    int num = 42;  // 스택에 할당됨
    return #   // 잘못된 포인터 반환! (dangling pointer)
}

 

위 코드는 num의 주소를 반환하나, 함수가 끝나면 해당 변수의 메모리는 해제(소멸) 된다.

이때 힙을 사용하면, 함수가 끝난 뒤에도 데이터를 유지할 수 있다.

 

2️⃣  동적으로 크기가 변하는 데이터를 다룰 때

스택에서는 변수가 컴파일 타임에 크기가 정해져야 한다.

 

void stackExample(int size){
    int arr[size];
}

 

위 코드에서 size가 런타임에 결정되면, 일부 컴파일러에서 오류가 발생할 수 있다.

반면, 힙은 런타임에 동적으로 크기를 정할 수 있어 유연하다.

void heapExample(int size){
    int* arr = (int*)malloc(size * sizeof(int));
    free(arr);
}

 

동적 크기 조정이 필요한 경우, 힙이 필수적이다.

 

3️⃣ 동적으로 크기가 변하는 데이터를 다룰 때

스택은 Last In, First Out ( LIFO ) 구조이므로 중간 데이터를 자유롭게 관리하기 어렵다.

 

void example(){
    int a = 10;
    int b = 20;
    // 스택에서 b를 해제하고 a만 유지하는 것이 불가능하다.
}

 

힙은 필요할 때마다 메모리를 할당(malloc)하고, 필요 없을 때 해제(free)할 수 있어 더 유연하다.

 

4️⃣ 멀티스레드 환경에서 공유 메모리가 필요

스택은 각 스레드마다 독립적으로 할당되므로, 스레드 간 공유 데이터를 저장할 수 없다.

힙에 할당된 메모리는 여러 스레드에서 공유할 수 있다.

 

 

결론, 대부분의 현실적인 프로그램에서는 힙이 꼭 필요하다.

'CS' 카테고리의 다른 글

[CS] 부동소수점  (0) 2025.04.15
[CS] 힙 단편화  (0) 2025.04.09
[CS] 메모리 보호 기법 ( ASLR )  (0) 2025.03.11
[cs] 문자열 상수  (0) 2025.02.23
[CS] 빅 엔디안, 리틀 엔디안  (0) 2025.02.23

+ Recent posts