호출 스택 포인터 는 C/C++에서 함수 호출이 발생할 때 스택 메모리 구조를 관리하는데 사용되는 포인터 이다.
스택 메모리는 후입선출(Last-In-First-Out) 방식으로 동작한다. 함수가 호출될 때 마다
호출 스택 프레임(Call Stack Frame)이 스택에 쌓이고, 반환될 때마다 해당 프레임이 스텍에서 제거된다.
이때 스택 포인터(Call Stack Pointer)는 현재 스텍프레임의 맨 위를 가리키는 포인터 이다. 이는 스텍메모리 에 대한 접근을 제어하고, 호출 스택 프레임의 크기를 결정하는데 사용된다.
( 스택 프레임에 가장 최근에 들어온 프레임의 바로 윗부분. 다음 프레임이 들어올 시작지점을 가리킨다.)
C++에서 n부터 1까지의 정수를 출력하는 재귀함수를 통해서 스택포인터를 살펴보자.
위 코드에서 호출 스택 포인터는 countdown함수의 호출과 반환과정에서 사용되는데,
countdown 함수가 호출될 때 마다 호출 스택 프레임이 생성되고, 호출스택 포인터는 그 프레임의 맨 위를 가리키게 된다.
countdown 함수가 반환될 때 마다 해당 프레임이 스택에서 제거되고, 호출 스택 포인터는 바로 이전 스택 프레임의 맨 위를 가리키게 된다.
여기서 반환 시 어떤식으로 일어나게 되냐면,
즉, 위 코드에서 countdown 함수가 반환될 때 마다 반환된 프레임이 스택에서 제거되고, 호출 스택 포인터는 바로 이전 스텍 프레임의 맨 위를 가리키게 된다.
위 코드에서는 재귀함수 임으로, countdown이 실행되었을 때마다 5부터 실행되서 1까지, 5,4,3,2,1 의 순서대로 스텍프레임이 쌓이게 되고, 1이 if문에 충족하지 않음으로, 출력값을 내보낸이후 스택 프레임에서 반환되어, 1,2,3,4,5 순서대로 반환되게 된다.
정리하자면
호출 스택 포인터(Stack Pointer) 는 호출 스택 프레임(Call Stack Frame) 의 가장 최근에 들어온 프레임의 바로 위를 가리키게 되고, 이는 반환시키는 프레임의 바로 다음 위치값을 나타낸다.
여담으로, java에서는 호출 스택 포인터 가 아닌 스택 프레임 포인터(Stack Frame Pointer) 라고 말하고 C/C++ 과 다르게 자동메모리 관리를 지원한다.
어셈블리어에서는 비슷한 ESP(Register Stack Pointer)라는 레지스터가 스택포인터 역할을 한다.
'컴퓨터 용어 정리' 카테고리의 다른 글
가변인자(variable argument) (0) | 2023.04.20 |
---|---|
스택 프레임(Stack Frame) (0) | 2023.04.20 |
심볼 테이블 ( Symbol Table ) (0) | 2023.04.19 |
L-value, R-value (0) | 2023.04.19 |
댕글링 포인터(Dangling Pointer) (0) | 2023.04.19 |