목차
- 01. Intro
- 02. 스택 프레임
- 정의
- 콜 스택 & 스택 프레임
- 스택 프레임 내부 구조
- 매개 변수 적재 순서
- 스택 오버플로우
- 03. 마무리
- 04. 연관 내용
01. Intro
오늘은 스택 프레임(Stack Frame)에 관련된 내용을 한 번 살펴보고자 합니다.
02. 스택 프레임
정의
스택 프레임은 함수가 호출될 때마다 생성되는 메모리 영역입니다.
즉, 어떤 함수가 호출되면, 해당 함수의 스택 프레임이 하나 생성됩니다.
생성된 스택 프레임은 콜 스택(Call Stack)에 순서대로 쌓입니다.
콜 스택과 스택 프레임의 관계는 아래에서 살펴보도록 하겠습니다.
콜 스택 & 스택 프레임
콜 스택(Call Stack)은 여러 개의 스택 프레임을 관리하는 저장소입니다.
함수가 호출되면, 호출한 함수에 대한 스택 프레임이 먼저 생성됩니다.
생성된 스택 프레임은 콜 스택에 쌓입니다.
이때, 스택 프레임은 콜 스택에 높은 메모리 주소에서 낮은 메모리 주소 순으로 쌓입니다.
현재 함수가 종료되면, 콜 스택에서 해당 스택 프레임을 제거합니다.
스택 프레임 제거한 뒤, 해당 함수를 호출한 위치로 되돌아갑니다.
원래 위치로 돌아감에 따라 콜 스택의 마지막에 위치한 스택 프레임의 함수로 돌아가는 것입니다.
현재 콜 스택의 상태를 보면, 스택 프레임이 제거되었기에 다시 높은 메모리 주소로 이동합니다.
그래서 함수 호출 및 종료 과정에 따라 콜 스택과 스택 프레임은 아래 사진처럼 작동합니다.

따라서, 콜 스택의 마지막 스택 프레임 위치는 [높은 주소 → 낮은 주소, 낮은 주소 → 높은 주소]로 계속해서 이동합니다.
스택 프레임 내부 구조
그렇다면, 스택 프레임의 내부 구조는 어떻게 구성되어 있는지 살펴보겠습니다.
스택 프레임의 내부 구조는 아래와 같이 구성되어 있습니다.
1. 매개 변수 : 함수가 전달받은 입력 파라미터
2. 반환 주소값 : 현재 함수 종료 후, 돌아갈 위치
3. 지역 변수 : 함수 내부에서 선언된 변수

위 순서대로 스택 프레임 내부에 쌓이게 됩니다.
그래서, 매개 변수가 스택 프레임의 가장 높은 메모리 주소에 위치합니다.
또한, 지역 변수는 스택 프레임의 가장 낮은 메모리 주소에 위치합니다.
그렇다면, 매개 변수가 여러 개인 경우에는 어떻게 쌓일까요?
매개 변수 적재 순서
함수의 입력 파라미터는 Right-to-Left 방식 즉, 오른쪽에서 왼쪽 방식으로 스택에 푸시합니다.
아래의 코드를 보면서 추가로 설명하겠습니다.
#include <iostream>
using namespace std;
// 단순히 두 수를 더하는 함수
int Add(int x, int y)
{
int result = x + y;
return result;
}
int main()
{
int temp = Add(3,4);
cout << temp << endl;
return 0;
}
단순히 두 수를 더하는 함수가 있습니다.
먼저, 프로그램을 실행하면, main 함수에 대한 스택 프레임이 생성되어 콜 스택에 적재됩니다.
그리고 Add 함수를 호출하므로 Add 함수의 스택 프레임이 생성됩니다.
Add 함수의 스택 프레임에는 먼저 매개 변수의 가장 오른쪽에 있는 y가 먼저 쌓입니다.
그리고 난 후에 x가 쌓입니다. 그 뒤로 반환 주소값과 지역 변수인 result가 쌓입니다.
위 코드를 실행할 때, 어셈블리어를 직접 확인해 보겠습니다.

위 사진을 보면, 정말로 뒤에 있는 매개 변수가 먼저 푸시되는 것을 확인할 수 있습니다.
이번에는 메모리를 직접 확인해 보겠습니다.

위 사진을 보면, 높은 메모리 주소에 매개 변수 y가 저장되고 그것보다 낮은 메모리 주소에 매개 변수 x가 저장됩니다.
스택 오버플로우
스택 오버플로우(Stack Overflow)는 함수를 계속 호출하면서, 스택 메모리가 콜 스택의 허용 범위보다 초과해서 쌓일 때 발생합니다.
특히, 재귀 함수를 무한히 호출하면, 발생합니다.
#include <iostream>
using namespace std;
// 단순히 두 수를 더하는 함수
int Add(int x, int y)
{
int result = x + y;
return result;
}
int main()
{
// 매우 많이 호출
for (int i = 0; i < 100'000'000; i++)
{
int temp = Add(3, 4);
cout << temp << endl;
}
return 0;
}
위 코드처럼 함수를 무수히 많이 사용하면, 스택 오버플로우가 발생합니다.
03. 마무리
스택 프레임과 관련해서 정리하면, 아래와 같습니다.
1. 스택 프레임은 함수 호출 시, 생성되는 메모리 블록입니다.
2. 콜 스택은 스택 프레임들이 순차적으로 쌓이고 마지막으로 쌓인 스택 프레임부터 사용합니다.
3. 함수가 종료되면, 해당 함수의 스택 프레임을 제거하고 이전 함수로 이동합니다.
4. 스택 프레임의 매개 변수는 오른쪽에서 왼쪽 방향으로 적재됩니다.
5. 스택 프레임은 매개 변수, 반환 주소값, 지역 변수 순으로 적재됩니다.
6. 스택 오버플로우는 모든 메모리를 사용하고 있는 콜 스택에 새로운 스택 프레임을 적재할 때, 발생합니다.
오늘은 스택 프레임에 대해서 알아봤습니다.
다음에는 스택 프레임과 관련된 추가 내용을 조금 더 살펴보겠습니다.
04. 연관 내용
- [C++] 스택 프레임 - 2. 적재 순서 메모리 확인
[C++] 스택 프레임 - 2. 적재 순서 메모리 확인
목차01. Intro02. 스택 프레임정의 및 구조 복습적재 순서 메모리 확인구조체 매개 변수03. 마무리04. 연관 내용01. Intro오늘은 스택 프레임(Stack Frame)의 적재 순서를 메모리와 어셈블리어를 통해 직
epidemic-barcode.tistory.com
읽어주셔서 감사합니다.
틀린 내용 지적은 언제나 환영입니다!
'게임 개발 > C++' 카테고리의 다른 글
| [C++] 캐스팅 - 1. C 스타일 캐스팅 (0) | 2025.03.04 |
|---|---|
| [C++] 스택 프레임 - 2. 적재 순서 메모리 확인 (0) | 2025.03.03 |
| [C++] inline 함수 - 2. 매크로 정의 지시어와 차이점 (0) | 2025.03.01 |
| [C++] inline 함수 - 1. 특징 (2) | 2025.02.28 |
| [C++] 오버라이딩 - 4. 가상 소멸자 (0) | 2025.02.27 |