스택 메모리 대 힙 메모리

가장 일반적인 인터뷰 질문 중 하나인 프로세스 메모리 영역의 스택 메모리 및 힙 메모리.

프로세스 메모리 공간은 스택 공간, 힙 공간, 데이터 공간 및 코드 공간으로 나뉩니다.


“스택 메모리”

스택 공간은 함수가 호출되거나 함수가 호출될 때 할당됩니다.

함수 호출에 사용되는 지역 변수와 매개 변수(Call By Value용)가 저장되고 함수 호출에 대한 활성 레코드가 입력됩니다.

또한 반납 시 반납 주소 정보를 통해 이전 절차로 반납이 가능합니다.

따라서 스택은 함수가 종료되거나 범위를 벗어날 때 반환되는 유형입니다.

함수가 이 시점에서 완료되지 않거나 깊이가 무한하거나 너무 크면 스택 오버플로가 발생할 수 있습니다.

또한 크기는 운영 체제 또는 컴파일러에 의해 결정되며 메모리는 연속적으로 관리되므로 빠르고 단편화되지 않습니다.

즉, 스택에 대한 액세스가 매우 빠르며 변수를 명시적으로 할당 해제할 필요가 없습니다.


“힙 스토리지”

힙 메모리는 메모리를 동적으로 할당하는 데 사용됩니다.

즉, 스택과 달리 메모리 공간이 연속적이지 않고 함수가 완료된 후에도 메모리에 남아 있습니다.

따라서 액세스는 스택보다 약간 느리고 일반적으로 메모리를 명시적으로 할당해야 합니다.


“알았어, 근데 왜 둘을 갈라놨어?”

사실 이 주제에 대해 글을 쓰고 싶어서 이 글을 썼습니다.

보통 테크블로그에서 차이점을 잘 설명해주지만 같이 쓰는 곳은 거의 없다.

어쨌든, 전술한 바와 같이 스택의 중요도에 따라 스택을 순차적으로 쌓는다.

다만 보통 용량이 작은 사이즈로 설정되어 있어서 쓰기가 조금 힘듭니다.

그렇다면 여기서 의문이 생길 수 있습니다.

운영 체제 시간에 스택 및 힙 메모리는 함께 동적으로 감소합니다… 모든 영역을 빠르고 조각화되지 않은 스택으로 구현할 수는 없습니까? 질문입니다.

요약하면 안된다.

스택 데이터 구조에서는 최상위만 데이터에 액세스할 수 있습니다.

이는 함수의 로컬 변수 메모리에만 액세스할 수 있음을 의미합니다.

따라서 힙에 할당할 때 포인터나 참조로 다소 느리지만 스택을 기준으로 범위를 벗어났음에도 불구하고 접근이 가능하다.

다시 말해서!
프로그램에서 스택 메모리를 잘 활용하면 좋겠지만 스택 데이터 구조의 특성상 범위를 벗어난 변수에 접근할 수 없고 쓸모없는 변수를 할당해야 하는 상황이 발생할 수 있습니다.

메모리만 힙이므로 스택과 힙으로 할당을 분할합니다.