스택의 용량이 무제한이라면, 힙이 필요할까?
📌 스택과 힙 간단 비교
특징 | 스택 | 힙 |
할당 방식 | 자동 ( 컴파일러가 관리 ) | 수동 ( 프로그래머가 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 |