본문 바로가기
공부

[TIL][C++, 게임 프로그래밍] 241203 2. 스택 메모리와 스택 프레임 with 계엄령

by 때려쳐아니때려치지마 2024. 12. 4.
반응형

계엄령이 선포를 바라보며 작성하는 til

박근혜 탄핵 가결되는 뉴스를 실시간으로 보며 야작했던 대학생활이 떠올라요
 
스택영역 : 함수의 호출과 관계있는 변수가 저장되는 영역
스택프레임에서 높은 주소에서 낮은 주소로 스택이 저장됨
[매개변수 -> 반환주소값 -> 지역변수] 순으로 함수에 대한 변수를 저장

 

32bit 64bit 차이 : 레지스터 크기 차이

cpu안에 있는 레지스터

레지스터 사이즈가 클수록 가져올수있는 주소 사이즈가 큼

메모리 최적화 -> 힙에서 저장하는 영역에 대하여 최적화함을 의미

 

스택오버플로우란 

함수에서 사용하는 변수들을 저장하는 스택 영역에서 지정한 사이즈의 영역보다 더 크게 메모리를 사용할경우 발생하는 에러


[궁금증!]
Q1. 선언되지 않은 상수는 어디에 저장될까
아래는 게임회사 코테에서 물어봤던 내용인데 해당 함수가 어떻게 동작하는지를 설명해야했다

int main() {
	cout << "Hello World!";
    // cout : iostream 헤더안에 표준입출력에서 출력 기능을 하는 객체
    // << : 비트 이동 연산자로 "Hello World!"라는 string 변수를 출력 스트림으로 이동시킴
}

이 함수에 대해 메모리 영역까지 설명할수있었다면 좋지않을까? 싶어서 다시 정리해본다
https://blog.naver.com/songsite123/222971827760

메모리 구조
stack : 함수 호출시 변수를 저장영역 (매개변수, 반환주소, 지역변수)
heap : 동적 메모리 할당 영역
bss segment : 초기화되지않은 전역변수, 정적변수 저장영역
data segment : 초기화된 전역변수, 정적변수 저장영역
text(code) segment : 코드와 상수 데이터 저장영역
 
A1. 위내용에 따르면 int main함수가 실행되면 "Hello World!"  라는 문자리터럴이 data segment 영역에 로드가 되고 <<  라는 비트 이동 연산자에 의해  cout 이라는 출력 스트림으로 전달이 되며 출력이 됩니다.


 
Q2. 함수의 매개변수로 string이있으면 string이라는 변수타입은 힙에저장되어야하고 함수의 매개변수는 stack에 저장되어야하는데 이경우에는 어느 저장 영역이 맞는가?
 

void PrintMessage(string message) {
    cout << message;
}

string myString = "Hello, World!";
PrintMessage(myString);

 
A2.매개변수와 데이터가 구분되어서 저장됩니다!
매개변수 (데이터를 가리키는 참조) message 는 stack에 저장되고
 myString 변수는 stack에 저장되고 "Hello, World!" 라는 문자열은 힙에 저장되고 해당 주소를 myString이 참조합니다.
 


요구안이 가결되었으니까 자러가용

반응형

댓글