스택 vs 힙 메모리: 차이점 설명
실행 중인 프로그램은 데이터를 위해 두 가지 주요 메모리 영역을 사용합니다. 스택은 함수 호출 프레임, 즉 지역 변수, 인자, 반환 주소를 담습니다. 자동으로 관리되고 매우 빠르지만 크기가 작고 각 함수 호출의 수명에 묶여 있습니다. 힙은 malloc이나 new처럼 프로그램이 명시적으로 요청한 메모리를 담으며, 해제될 때까지 유지됩니다. 힙은 유연하고 크지만 더 느리고, 메모리 누수와 단편화가 발생하는 곳입니다.
| 비교 항목 | 스택 | 힙 |
|---|---|---|
| 용도 | 함수 호출 프레임: 지역 변수, 인자, 반환 주소 | 함수보다 오래 살아야 하거나 크기를 미리 알 수 없는 동적 할당 데이터 |
| 할당 | 자동: 호출과 반환 때마다 스택 포인터가 이동 | 명시적: malloc과 free, new와 delete, 또는 가비지 컬렉터 |
| 속도 | 매우 빠름: 포인터만 조정 | 더 느림: 할당자가 빈 블록을 찾고 기록을 유지해야 함 |
| 수명 | 함수가 반환될 때까지 | 메모리가 해제(또는 가비지 컬렉션)될 때까지 |
| 크기 | 제한적(보통 스레드당 수 메가바이트) | 사용 가능한 메모리에 의해서만 제한 |
| 배치 | 보통 높은 주소에서 아래로 자람 | 보통 낮은 주소에서 위로 자라서, 둘이 서로를 향해 자람 |
| 단편화 | 없음 | 가능: 할당과 해제를 반복하면 쓸 수 없는 빈틈이 남을 수 있음 |
| 스레드 | 각 스레드가 자신만의 스택을 가짐 | 모든 스레드가 공유하므로 할당자가 스레드 안전해야 함 |
| 흔한 오류 | 깊은 재귀나 큰 지역 배열로 인한 스택 오버플로 | 메모리 누수, 해제 후 사용, 이중 해제, 메모리 부족 |
수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.