Computer_Language/C

[C] C언어의 Stack_Frame

Joo-Topia 2019. 10. 15. 22:24

오늘은 스택 프레임에 대해 공부했다.

사실 이해하는데 정말 많은 시간이 걸렸는데 막상 공부하고 보니 그렇게 어려운 개념은 아닌 것 같다.

 

시작하기 전에..


비주얼 스튜디오 2019를 통해 결과를 확인해보려 했는데, 디버그 옵션도 변경하고, 최적화 설정도 "사용 안 함"으로 바꿔줬는데 스택과 스택 사이에 예상하지 못한(?) 값이 계속 들어가서 아직도 실습을 못해보고 있다..ㅜ

제대로 된 설정을 찾게 되면 꼭 직접 테스트해보고 싶다.
아니면 우분투에서 GDB를 써서라도 꼭 확인해 볼 것이다.

 

스택 프레임


스택 프레임을 한 줄로 요약하자면,
"함수 a가 호출되었을 때 그 함수가 가지는 공간(공간의 구조)"이다.

스택 영역을 함수가 어떻게 사용하는지 천천히 공부해보자.

#include <stdio.h>

void func_a() {
	printf("func_a\n");
}

int main(void) {
	func_a();
	return 0;
}

 

이렇게 보면 엄청 간단하지만, 사실 스택에는 함수 자체가 적재되지 않는다.

좀 더 사실적으로 위 코드의 결과를 그려보았다.

1. main함수를 진행하면서 stack에 메모리를 쌓게 된다. (예제 코드에는 생략된 부분)

2. main함수에서 func_a를 호출한다.
2-1) func_a가 복귀하면 수행할 명령어의 위치 push 한다. (Instruction Pointer)
2-2) 현재 함수가 시작된 지점(이전 BP)을 push 한다. (Base Pointer)

3. func_a함수가 종료되면 BP와 IP를 이용해 이전의 호출 지점으로 되돌아간다.

 

사실 자세히 파고들면 훨씬 더 많은 작업들이 진행되지만 최대한 간략하게 그려본 과정이다.

이해한 내용을 간단하게 그렸는데도 불구하고 함수의 호출 과정에서 생각보다 많은 이동이 발생한다는 점과 함수가 stack에서 공간을 어떻게 차지하는지 볼 수 있었다.

 

마무리


오랜만에 어려운 내용이어서 그런지 뭔가 딱 정리되지 못한 기분이다.

조금 더 공부해서 글을 수정해야겠다.

 

"스택" 하면 LIFO 형태의 자료구조라고만 알고 있었는데, 이번 기회에 조금 더 깊은 공부를 하게 된 것 같다.

 

스택 없이 heap으로만 프로그래밍이 가능하냐는 질문을 받아 본 적이 있다.

스택이 없다면 함수는 돌아갈 위치를 알 수 없을 것이다.

그 당시에는 yes라고 했지만 공부를 해 보니까 현실적으로 불가능할 것 같다는 생각이 든다.(바보..)