스택 프레임은 함수 호출과 반환 과정에서 사용되는 데이터 구조로, 주로 함수 호출 시 함수의 지역 변수,
반환 주소, 매개변수 등을 저장하는 데 사용된다. 
스택 프레임은 프로그램이 실행될 때마다 생성되고, 함수가 반환될 때마다 소멸된다.

 

📌 스택 프레임 지정원리 #1

  • 스택 메모리 주소는 0번지를 향해 증가한다.
  • 지역변수는 선언한 순서대로 스택에 Push 한다.
  • 매개변수는 오른쪽부터 스택에 Push 한다.
  • 스코프 단위로 끊어서 표시한다. ( 함수는 별도 단락으로 표시한다. )

📌 스택 프레임 지정 ( 지역변수 )

예제를 통해 살펴보자

#include<stdio.h>

int main(void)
{ // 1번째 스코프
    int a = 3; // 1번째 a
    int b = 4;
    int aData[5] = { 0x10, 0x20, 0x30, 0x40, 0x50 };
    
    printf("a: %d\n", a); // 1번째 a가 출력
    
    if(a > 2) // 1번째 a를 확인
    { // 2번째 스코프
    	int a = 5; // 2번째 a
        printf("a: %d\n", a); // 2번째 a가 출력
    }
    
	return 0;
}

 

위 코드를 실행할때 스택 영역에 쌓이는 데이터를 그림으로 살펴보면 다음과 같다.

Stack 영역 구조

 

첫번째 a와 2번째 a는 이름은 같지만 메모리에 적재되는 위치가 다르기 때문에 다른 지역 변수라고 생각할 수 있다.

 

실제 메모리에 어떻게 들어가는지 확인해보자.

32비트 환경 Stack 영역

 

그림으로 표시한 Stack 영역처럼 메모리에도 순서대로 데이터가 쌓이는 것을 확인할 수 있다.

 

위 구조는 32비트 환경에서 빌드한 것인데, 64비트 환경에서 빌드하면 전혀 다른 스택 프레임이 나타난다.

 

64비트 환경 Stack 영역

 

64비트 환경에서는 Stack이 아래로 쌓이는 것을 확인할 수 있다.

64비트에서는 Stack 영역을 최대값까지 증가된 채로 지정해 놓고 위에서 아래로 내려오는 방식으로 관리하는 것


📌 스택 프레임 지정 ( 함수 )

예제를 통해 살펴보자

int add(int a, int b);

 

위와 같은 함수가 있을때 호출하면 스택 프레임에 매개변수가 쌓이는 순서는 아래 그림과 같다.

앞서 언급한것 처럼 매개변수는 오른쪽부터 아래에 순서대로 쌓인다.

 

#include <stdio.h>

int add(int paramA, int paramB)
{
    int a = paramA;
    int b = paramB;

    printf("a: %d b: %d", a, b);
}

int main()
{
    add(3, 4);
    return 0;
}

 

위 코드를 실행할때 함수안에 지역변수가 있으면 매개변수가 먼저 쌓일까? 지역변수가 먼저 쌓일까?

32비트 환경에서 메모리를 살펴보자.

 

 

메모리를 살펴보면 위 그림과 같다. 매개변수가 먼저 쌓이고, 이후 지역변수가 쌓이는 것을 확인할 수 있다.

 

64비트 환경에서 메모리를 살펴보자.

 

32비트 환경과는 완전히 다른 구조로 변경되어 있는것을 확인할 수 있다.


📌 스택 프레임 지정원리 #2

  • 함수 반환 시 해당 함수가 사용한 스택 메모리는 삭제된다.
  • 전역, 정적 변수는 스택을 사용하지 않는다.

+ Recent posts