스택 vs 힙 메모리: 차이점 설명

실행 중인 프로그램은 데이터를 위해 두 가지 주요 메모리 영역을 사용합니다. 스택은 함수 호출 프레임, 즉 지역 변수, 인자, 반환 주소를 담습니다. 자동으로 관리되고 매우 빠르지만 크기가 작고 각 함수 호출의 수명에 묶여 있습니다. 힙은 malloc이나 new처럼 프로그램이 명시적으로 요청한 메모리를 담으며, 해제될 때까지 유지됩니다. 힙은 유연하고 크지만 더 느리고, 메모리 누수와 단편화가 발생하는 곳입니다.

비교 항목스택힙
용도함수 호출 프레임: 지역 변수, 인자, 반환 주소함수보다 오래 살아야 하거나 크기를 미리 알 수 없는 동적 할당 데이터
할당자동: 호출과 반환 때마다 스택 포인터가 이동명시적: malloc과 free, new와 delete, 또는 가비지 컬렉터
속도매우 빠름: 포인터만 조정더 느림: 할당자가 빈 블록을 찾고 기록을 유지해야 함
수명함수가 반환될 때까지메모리가 해제(또는 가비지 컬렉션)될 때까지
크기제한적(보통 스레드당 수 메가바이트)사용 가능한 메모리에 의해서만 제한
배치보통 높은 주소에서 아래로 자람보통 낮은 주소에서 위로 자라서, 둘이 서로를 향해 자람
단편화없음가능: 할당과 해제를 반복하면 쓸 수 없는 빈틈이 남을 수 있음
스레드각 스레드가 자신만의 스택을 가짐모든 스레드가 공유하므로 할당자가 스레드 안전해야 함
흔한 오류깊은 재귀나 큰 지역 배열로 인한 스택 오버플로메모리 누수, 해제 후 사용, 이중 해제, 메모리 부족

수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.

상황별 선택 기준

스택
일반적인 지역 변수처럼 크기를 컴파일 시점에 알 수 있는 작고 수명이 짧은 데이터.
힙
큰 데이터, 실행 시점에 크기가 바뀌는 데이터, 생성한 함수보다 오래 살아야 하는 데이터.

자주 묻는 질문

스택 할당이 힙 할당보다 빠른 이유는 무엇인가요?

스택 할당은 스택 포인터만 이동하면 되지만, 힙 할당은 빈 블록을 찾고 할당자의 기록을 갱신해야 하기 때문입니다.

스택 오버플로의 원인은 무엇인가요?

깊거나 무한한 재귀, 매우 큰 지역 배열 등으로 스택을 너무 많이 사용해 스택 크기 제한을 넘기면 프로그램이 비정상 종료됩니다.

메모리 누수란 무엇인가요?

할당되었지만 해제되지 않아 재사용할 수 없는 힙 메모리입니다. 누수가 반복되면 프로그램이 점점 더 많은 메모리를 사용합니다.

스레드가 스택을 공유하나요?

아니요. 각 스레드는 자신만의 스택을 가지며, 힙은 모든 스레드가 공유합니다.

주요 용어 설명

スタックフレーム
関数が呼ばれるたびにスタック上に確保する領域。戻り先、保存したレジスタ、局所変数などを置き、関数から戻るときに解放する。
スタックポインタ
スタックの今の先頭の番地を指すレジスタ。RISC-Vではsp(x2)。多くのISAでスタックは番地の小さい方へ伸びる。
ヒープ
プログラムの実行中にmallocなどで必要な大きさのメモリを確保し、freeで返す領域。確保と解放を繰り返すと断片化が起きることがある。

관련 비교