[CS] Stack 과 Heap에 대해서
카테고리: CS
태그: Programming CS
개요
지난번에 메모리를 효율적으로 관리하는 것에 대해 관심을 가지고 Struct와 Class를 상황에 맞게 사용하는 법에 대해 공부하면서 포스팅 했다.
공부하면서 Stack
과 Heap
에 대해 간단히 언급 했었는데 이번에는 이 둘에 대해 자세히 알아보고자 한다.
메모리 구조
Stack
과 Heap
에 대해 알아보기 위해 그들을 포함하는 메모리 구조
에 대해 알아보자.
의미
프로그램이 실행되기 위해서 프로그래머는 코드를 작성한다.
그 코드(변수, 함수 등)들이 프로그램으로 실행되기 위해 저장되는 공간이 메모리다.
메모리는 다양한 영역으로 나뉘는데 크게 대표적으로 4가지가 있다.
영역
- 코드(code) 영역
- 프로그래머가 작성한 코드들이 저장되는 영역이다.
(컴파일하여 컴퓨터가 이해할 수 있는 기계어로 저장)
- 프로그래머가 작성한 코드들이 저장되는 영역이다.
- 데이터(data) 영역
-
전역(global) 변수와 정적(static) 변수가 저장되는 영역이다.
-
프로그램이 시작할때 저장되고 계속 가지고 있다가 프로그램이 종료되었을 때 소멸된다.
-
- 스택(stack) 영역
-
값 타입(value)
이 저장되는 메모리 공간이다. -
매번 사용되고 버려지는 임시 공간이기도 하며 함수 호출 시 함수에 포함된 지역변수(local), 매개변수(parameter)가 저장되어 함수 호출이 끝나면 소멸된다.
-
고정된 크기의 메모리 공간을 사용하는 정적 공간이다.
-
후입 선출(LIFO, Last-In First-Out) 방식으로 새로운 요소를 삽입(push)하고 삭제(pop)할때 스택의 상단(top)에서만 이루어 진다. 이러한 작업은 상수 시간 O(1) 이므로 효율적이다.
-
- 힙(heap) 영역
-
참조 타입(reference)
이 저장되는 메모리 공간이다. -
런타임 중, 프로그래머에 의해 메모리 공간이 동적 할당(Dynamic Memory Allocation) 되고 해제된다. 프로그래머가 직접 제어하기에 메모리 공간 사용이 스택 보다 자유롭다.
-
동적으로 메모리를 할당하고 해제하기 때문에 정적인 스택에 비해 속도가 느리다. 또한 직접 관리하기 때문에 적정 시기에 해제를 하지 않을 경우
메모리 누수(leak)
가 발생할 수 있다.
-
참고 그림
-
메모리 오버플로우
-
Stack
의 경우 높은 주소에서 낮은 주소 방향으로 메모리를 할당하고,Heap
의 경우 낮은 주소에서 높은 주소 방향으로 메모리를 할당한다.- 이는 서로 반대 방향으로 시작하여 둘 중 하나라도 자기 공간보다 큰 공간을 사용한다 던가, 잘못된 데이터 접근 등으로 인해
스택오버플로우
또는힙오버플로우
가 발생하여 프로그램 실행에 문제가 발생할 수 있으므로 주의해야 한다.
- 이는 서로 반대 방향으로 시작하여 둘 중 하나라도 자기 공간보다 큰 공간을 사용한다 던가, 잘못된 데이터 접근 등으로 인해
-
참고 자료
📚 혼자 공부하면서 기록한 공간입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😉
댓글 남기기