[CS] Stack 과 Heap에 대해서

Date:

카테고리:

태그:

개요

지난번에 메모리를 효율적으로 관리하는 것에 대해 관심을 가지고 Struct와 Class를 상황에 맞게 사용하는 법에 대해 공부하면서 포스팅 했다.

공부하면서 StackHeap에 대해 간단히 언급 했었는데 이번에는 이 둘에 대해 자세히 알아보고자 한다.

메모리 구조

StackHeap에 대해 알아보기 위해 그들을 포함하는 메모리 구조에 대해 알아보자.

의미

프로그램이 실행되기 위해서 프로그래머는 코드를 작성한다.

그 코드(변수, 함수 등)들이 프로그램으로 실행되기 위해 저장되는 공간이 메모리다.

메모리는 다양한 영역으로 나뉘는데 크게 대표적으로 4가지가 있다.

영역

  1. 코드(code) 영역
    • 프로그래머가 작성한 코드들이 저장되는 영역이다.
      (컴파일하여 컴퓨터가 이해할 수 있는 기계어로 저장)
  2. 데이터(data) 영역
    • 전역(global) 변수와 정적(static) 변수가 저장되는 영역이다.

    • 프로그램이 시작할때 저장되고 계속 가지고 있다가 프로그램이 종료되었을 때 소멸된다.

  3. 스택(stack) 영역
    • 값 타입(value)이 저장되는 메모리 공간이다.

    • 매번 사용되고 버려지는 임시 공간이기도 하며 함수 호출 시 함수에 포함된 지역변수(local), 매개변수(parameter)가 저장되어 함수 호출이 끝나면 소멸된다.

    • 고정된 크기의 메모리 공간을 사용하는 정적 공간이다.

    • 후입 선출(LIFO, Last-In First-Out) 방식으로 새로운 요소를 삽입(push)하고 삭제(pop)할때 스택의 상단(top)에서만 이루어 진다. 이러한 작업은 상수 시간 O(1) 이므로 효율적이다.

  4. 힙(heap) 영역
    • 참조 타입(reference)이 저장되는 메모리 공간이다.

    • 런타임 중, 프로그래머에 의해 메모리 공간이 동적 할당(Dynamic Memory Allocation) 되고 해제된다. 프로그래머가 직접 제어하기에 메모리 공간 사용이 스택 보다 자유롭다.

    • 동적으로 메모리를 할당하고 해제하기 때문에 정적인 스택에 비해 속도가 느리다. 또한 직접 관리하기 때문에 적정 시기에 해제를 하지 않을 경우 메모리 누수(leak)가 발생할 수 있다.

참고 그림

  • 메모리 오버플로우

    • Stack의 경우 높은 주소에서 낮은 주소 방향으로 메모리를 할당하고, Heap의 경우 낮은 주소에서 높은 주소 방향으로 메모리를 할당한다.

      • 이는 서로 반대 방향으로 시작하여 둘 중 하나라도 자기 공간보다 큰 공간을 사용한다 던가, 잘못된 데이터 접근 등으로 인해 스택오버플로우 또는 힙오버플로우 가 발생하여 프로그램 실행에 문제가 발생할 수 있으므로 주의해야 한다.

참고 자료



📚 혼자 공부하면서 기록한 공간입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😉

맨 위로 이동하기

CS 카테고리 내 다른 글 보러가기

댓글 남기기