C++ 스택과 힙

백승호·2021년 2월 4일
0

프로그램이 사용하는 메모리 분류

1) 코드 세그먼트: 컴파일된 프로그램이 저장되는 영역
2) 데이터 세그먼트: 전역 변수, 정적(static) 변수가 저장되는 영역
3) 힙 세그먼트: 동적으로 할당된 변수가 할당되는 영역
4) 스택 세그먼트: 함수 매개변수, 지역 변수 및 기타 함수 관련 정보가 저장되는 영역

(코드 세그먼트, 데이터 세그먼트, 힙 세그먼트)는 프로그램의 "런타임"에, 즉, 실행시간에 크기가 결정되는 반면 (스택 세그먼트)는 "컴파일 타임"에 크기가 결정된다.

힙 세그먼트

힙 세그먼트는 동적으로 할당된 변수가 할당되는 영역이다.
new 연산자를 사용해서 메모리를 할당하게되면 응용 프로그램의 힙 세그먼트에 할당된다. 메모리의 힙 영역은 사용자가 직접 관리할수있고, 해야만 하는 메모리 영역이다. 힙영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

힙에 메모리를 할당하는것은 스택에 메모리를 할당하는 것보다 비교적 느리며, 할당된 메모리는 명시적으로 할당 해제하지 않으면 응용프로그램이 종료될때까지 유지되는 메모리리크가 발생할 수 있다. 또한 동적으로 할당된 메모리는 포인터를 통해 접근하기 때문에 변수에 직접 접근하는 것보다 역참조에 필요한 시간이 더 소요된다는 특징이 있다. 그러나 힙은 스택보다 큰 메모리 공간을 가지고있기때문에 보다 큰 배열 및 구조체 또는 클래스를 할당받을 수 있다.

스택 세그먼트

컴파일 타임에 그 크기가 결정되는 스택 세그먼트는 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다. 함수의 호출과 함께 할당되며 호출이 완료되면 소멸한다. 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임이라고 한다. push로 데이터를 저장하고 pop으로 데이터를 꺼내온다. 이름과 같이 stack되어 들어온 순서대로 차곡차곡 쌓여 가장 먼저 들어온 데이터가 가장 마지막에 나갈수있게된다. 왜냐, 함수 호출이 끝나면 그 함수를 호출했던 이전의 함수로 되돌아가야하기때문이다.

스택에 메모리를 할당하는것은 비교적 빠르다. 다만, 스택에 할당된 메모리는 스택 범위에 있을때만 접근할수있다. 또한 비교적 크기가 작기때문에 공간을 많이 차지하는 지역변수를 만드는 것은 좋지않다. 가령

int main()
{
 	int myList[10000000000000000];
 	return (0);
}    

이렇게 너무 많은 양의 메모리공간을 스택에 생성하려고하면 스택 오버플로우가 발생한다.
스택 세그먼트 크기가 배열을 처리할만큼 충분히 크지 않으므로 배열 할당은 으용 프로그램에서 사용할 수 없는 메모리부분까지 침범하려하게되고 그러면 위험하기 때문에 프로그램이 다운된다.

결론?

스택은 컴파일타임에 메모리가 잡히는 반면 힙은 런타임에 메모리가 잡힌다.
스택의 데이터는 명시적으로 할당/해제 할 필요없고 빠르다. 하지만 크기 제한이 있고 오버플로우가 날수있다. 반면 힙은 데이터를 명시적으로 할당/해제 해야만 하며 느리지만 크기 제한이 없다(비교적으로).

💡 개인 공부 기록용 글입니다. 틀린 부분이 있을경우 언제든지 댓글로 지적해주시면 감사하겠습니다 😊
profile
삽질하는 개발자 지망생

0개의 댓글