오늘은 스택 프레임에 대해 공부했다.
사실 이해하는데 정말 많은 시간이 걸렸는데 막상 공부하고 보니 그렇게 어려운 개념은 아닌 것 같다.
시작하기 전에..
비주얼 스튜디오 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라고 했지만 공부를 해 보니까 현실적으로 불가능할 것 같다는 생각이 든다.(바보..)
'Computer_Language > C' 카테고리의 다른 글
[C] 인덱스 검사(경계 검사)에 대하여 (0) | 2019.08.31 |
---|---|
[C] 위치를 기록하는 동안 액세스 위반이 발생했습니다. 에 관하여 (1) | 2019.08.27 |