A. 스택 (STACK)
1. 스택 메모리 = 스택
a. 스택 메모리란?
🌟 컴퓨터 프로그램에서 사용되는 메모리 영역 중 하나
- 스택은 데이터를 선형 구조로 저장. 주로 함수가 사용하는 공용 공간
- 높은 주소에서 낮은 주소로 이동
- 크게 할당을 받아서 시작 (mb기준)
- 스택 메모리는 운영 체제나 컴파일러에 의해 관리
b. 스택의 메모리의 특징
전역 변수의 주소처럼 고정 주소가 없음 항상 상대 주소!!
기준점(함수의 이름)의 데이터(변수의 위치)를 계산하는 형태
1) LIFO (Last-In-First-Out) 구조
스택은 데이터를 LIFO 구조로 저장 = 후입선출
2) 함수 호출 및 복귀
스택은 함수 호출과 관련된 정보를 저장하는 데 사용
함수가 호출될 때 현재 상태의 스택 프레임이 생성,
함수가 반환할 때 스택 프레임이 제거되어 이전 호출 지점으로 돌아감
3) 지역 변수 및 매개변수 저장
각 함수 호출에 대한 지역 변수와 매개변수는 해당 함수의 스택 프레임에 저장
함수가 종료되면 스택에서 제거
4) 재귀 호출
재귀 함수가 호출될 때마다 새로운 스택 프레임이 생성
호출이 깊어지면 사용량 증가할 수 있음
5) 컨텍스트 스위칭
스레드 간의 컨텍스트 스위칭에서도 스택 메모리가 사용
스레드는 각각 자체 스택을 가지며, 스레드 간 전환 시 스택 포인터가 변경
c. 스택 메모리의 이용
주로 작은 크기의 데이터를 빠르게 저장하고 검색하는 데 사용
임시 데이터 저장 및 함수 호출 관리에 중요한 역할
d. 스택 메모리의 도식화
직접 확인하려면
위 사진의 메모리 1과 레지스터 장을 켜서 어셈블리어로 주소값을 직접 확인하는 방법을 사용할 수 있음
2. 스택 프레임
a. 스택 프레임이란?
🌟 프로그램의 실행 중에 함수 호출과 관련된 정보를 저장하는 메모리 공간
b. 스택 프레임의 특징
- 스택(Stack) 자료 구조에 저장
- 새로운 스택 프레임이 생성 = 스택의 맨 위에 푸시(push)
- 함수가 종료되면 해당 함수의 스택 프레임이 팝(pop)되어 제거
c. 스택 프레임의 정보
1) 지역 변수(Local Variables)
함수 내에서 선언된 지역 변수들은 스택 프레임에 저장
변수는 함수가 호출될 때 생성되고, 함수가 종료될 때 삭제
2) 함수의 매개변수(Parameter Values)
함수가 호출될 때 전달된 매개변수들은 스택 프레임에 저장
매개변수는 함수 내에서 사용되며 함수 실행이 끝날 때 제거
3) 함수의 반환 주소(Return Address)
함수가 호출되면 이전에 실행 중이던 코드의 주소(함수 호출 직전 명령어의 주소)가 스택 프레임에 저장
함수 실행이 끝나면 이 주소를 사용하여 호출자 함수로 돌아감
4) 함수 내의 중요 정보
함수 내에서 다양한 중요 정보(예: 이전의 스택 프레임 포인터)가 저장
d. 스택 프레임의 중요성
함수 호출과 관련된 호출 스택(Call Stack)의 핵심 구성 요소
호출 스택은 함수 호출 순서를 추적하고, 함수가 종료될때 제대로 복귀할 수 있도록 함
이러한 구조는 재귀 함수 호출 및 다양한 함수 간의 상호작용을 관리하는데 중요
🌟 스택 프레임과 호출 스택은 프로그램 실행의 핵심 부분
메모리 관리와 함수 호출 흐름을 효과적으로 관리하는 데 도움
B. CPU
1. 레지스터
a. 레지스터란?
cpu도 연산을 하기 위한 레지스터라는 공간이 있음 (cpu의 손발)
레지스터의 크기 하나가 32비트/64비트로 지정이 되어있는 것
32비트가 표현할 수 있는 숫자 범위 : 42억 = 4GB
따라서 큰 주소는 표현할 수 없음
👉 요즘에는 다 64비트로 사용함
b. 함수와 레지스터
예전 32비트를 사용할 땐 함수의 매개변수가 작아도 무조건 스택 영역에 넣고 이동을 했지만,
64비트를 사용할 땐 레지스터 영역에 바로 넣어주는 경우도 있음!
c. 디버그 모드
함수를 호출하고 데이터를 할당할때에는 중간중간 쓰레기 값이 들어감
디버그 모드에서는 이 쓰레기값을 침범하는 데이터가 들어가 있다면 오류를 내고 디버깅할 수 있게 해줌
카나리 기법이라고도 함 (=메모리 보호 기법)
'프로그래밍 언어 > C++' 카테고리의 다른 글
[자료형(data type)] C++ 파생형 함수 총정리 1 (0) | 2023.09.06 |
---|---|
[게임 프로그래머 입문 올인원] 함수와 디버깅 : 파일 분할 (16강) (0) | 2023.09.06 |
[게임 프로그래머 입문 올인원] 함수와 디버깅 : 함수, 변수의 범위 (12강) (0) | 2023.09.05 |
C++ 제어문 총정리 (0) | 2023.09.05 |
[게임 프로그래머 입문 올인원] 데이터와 로직 : 조건문, 반복문, 연습문제 (8, 9, 10강) (0) | 2023.09.05 |