스택 메모리 (LIFO, Last In Firtst Out)
스택 메모리는 각 함수(main함수도 함수다)에서 사용하는 지역 변수등을 임시적으로 저장하는 공간이다.
스택 메모리의 크기는 프로그램 빌드시 결정이 된다(함수를 다 호출할 때 필요한 메모리를 컴파일할 때 결정)
스택 메모리 위치는 프로그램 실행시에 운영체제가 알아서 붙여준다.(가상 페이징, 가상 메모리 개념)
운영체제가 알아서 붙여주기에 반드시 그림처럼 '코드, 데이터, 힙, 스택'순으로 주소가 생기지는 않지만, 전통적으로 그래왔기 때문에 그림을 이렇게 표현하였다.
함수가 호출이 될 때마다 함수에서 필요한 공간만큼 스택에서 떼어 줬다가 함수가 반환을 하면 지워버린 다는 개념
즉, 함수 메모리 영역으로 스택 메모리라고 불린다.
함수 호출 될 때 필요한 공간은 지역 변수만큼 메모리를 사용한다고 생각하면 편하다.
예를 들면
- A함수가 지역변수 등등을 가지고 스택메모리 맨 위에 있다고 가정
- 이 때, A함수에서 B함수를 호출하면 A함수가 차지하고 있는 메모리 아래에 B함수의 메모리 공간이 할당됨
- B함수가 C함수를 또 호출한다면 마찬가지로 B함수 메모리 아래에 C함수의 메모리 공간이 할당됨
- C가 값을 반환을 하면 C메모리를 없앰
- 이후 B가 값을 반환하면 B메모리를 없앰
- 마지막으로 A가 값을 반환하고 A메모리를 없앰
위와 같은 과정으로 스택 메모리가 할당되고 없어지고 하기 때문에 자료구조 스택과 비슷해서 스택 메모리라고 부르는 것뿐이다.
C반환하기 전에 B에 있는 메모리는 안 없어지나요?
B함수에서 C를 호출했기 때문에 C함수가 값을 반환하기 전까지는 B함수가 값을 반환하여 메모리가 없어지는 경우는 없기 때문에 함수들을 스택 메모리에 할당시킨다.
그렇기 때문에 스택 메모리는 빈 공간 없이 차곡차곡 쌓여있다.
cf) 전역 변수는 프로그램 실행동안 계속 있어야 되기 때문에 데이터 영역에 저장되어 있다.
스택 메모리와 힙 메모리의 차이
힙 메모리를 나중에 글에서 설명하겠지만 스택 메모리와 힙 메모리의 차이는 스택메모리는 함수 안에 있는 지역 변수와 매개변수가 저장되는 메모리로 컴파일할 때 이미 계산이 되어 있기 때문에 빠르게 할당, 접근, 해제가 가능하고 차곡차곡 쌓여있기 때문에 메모리 낭비가 없다.
하지만 힙 메모리는 사용자가 따로 할당, 접근, 해제를 해야해서 스택보다는 느리게 할당이 되고 할당을 자기 맘대로 하고 삭제하고 하기 때문에 메모리가 차곡차곡 쌓이지 않고 낭비가 생긴다.
스택 메모리 정리
- 각 함수에서 사용하는 지역변수등을 임시적으로 저장하는 공간
- 컴파일러가 스택 메모리의 크기를 이미 계산 했기 때문에 힙 메모리 보다는 빠르게 할당, 해제가 가능
- 함수가 호출 될 때마다 필요한 공간을 스택에서 떼어줬다가 함수가 끝나면 다시 가져감(엄밀한 건 다음 글에서)
- 스택 메모리는 빈 공간없음
- 스택 메모리 크기는 프로그램 빌드시 결정됨
출처 : POCU Academy COMP2200
'C언어 > C언어' 카테고리의 다른 글
[C언어]함수 호출을 통한 스택 메모리 이해[1](by 어셈블리어) (0) | 2023.02.21 |
---|---|
[C언어]강제 형변환 (0) | 2023.02.17 |
[C언어]함수 매개변수에 함수를 넣으면 순서대로 작동할까?(함수 매개변수의 평가순서) (0) | 2023.02.17 |
[C언어]링크(Link) 단계 (컴파일과 링크가 따로 되어있는 이유) (0) | 2023.02.16 |
[C언어][Hex]헥스편집기 HxD editor 다운로드 방법 (0) | 2023.02.16 |
댓글