6일차 (12/18)

2023. 12. 18. 09:59Unreal 강의

cdecl

https://luinbarr.tistory.com/9

 

5일차 (12/15)

Git 변경 내용 M => 수정된 항목 D => 삭제된 항목 A => 추가된 항목 조건문 게임은 조건문으로 만든다. HP가 0이라면? => 사망 애니메이션을 띄운다. 구매 시 돈이 없다면? => 경고 메세지를 띄운다. 명

luinbarr.tistory.com

5일차 printf 함수 세부 설명에서 넘어갔던 cdecl에 대해 설명한다.

눈에 보이지는 않지만 보통 생략되서 표현되는 부분이다.

cdecl은 함수 호출을 해주는 것인데 우리가 보통 함수를 만들게 되면 함수 호출 규약이라는 것을 사용하게 된다.

이때 컴파일러가 알아서 적당한 것을 붙여준다. 

함수라는 것은 CPU에 요청되고 스택 메모리를 사용한다.

어떠한 함수가 생성되고 삭제되었을때 그 함수에 대한 책임을 누가 지는가

 

일반적으로는 알아서 해주지만 어셈블리 코드에서는 다르다.

기계어로 함수를 호출하면 호출자와 정리자, 인자 넘기기 등등을 내가 다 해줘야 하는데 이 경우엔 함수 호출규약마다 따로 작성해줘야 된다.

 

전역함수는 대부분 __cdecl을 사용한다.

 

추후에 멤버함수와 static 멤버함수라는 것을 더 배우게 되고 그때 언급할텐데 static 멤버함수는 __stdcall을 사용하고 일반 멤버함수는 __thiscall이라는 c++전용을 사용한다. 억지로 함수의 call방식을 바꿀 수는 있지만 그것을 바꾸면 더 큰 문제가 생길 수도 있다.


const

const는 코드 독해의 핵심 파트이기 때문에 매우 중요하다.

const는 상수화이다.

const int Value = 0;

위 코드의 메모리 영역은 비트적 상수성을 지키겠다는 것이다.

즉 위 코드는 int는 4바이트이므로 해당 4바이트는 비트 단위로 고칠 수 없다(이 값을 지키겠다.)라는 것이다.

 

메모리 영역의 크기가 중요한 것이지 자료형에 따른 형태는 언제든지 바꿀 수 있다.

 

const는 특정 메모리 영역의 값을 변경할 수 없다.

그래서 프로그래머들끼리 암묵적인 합의로 const가 붙지 않은 포인터나 레퍼런스는 값이 바뀌어서 나올 수 있다는 것을 동의하는 것이다.

참조형(포인터나 레퍼런스)를 인자로 받는 함수가 참조형에 const를 안걸어놨다면 무조건 값이 수정되어서 나올 수 있다는 의미로 받아들인다.

그래서 const를 붙임으로서 사용자가 넣어준 값이 바뀌지 않을 것이라는 것을 명시해주는 것이다.

 

코드영역은 자동적으로 값을 수정할 수 없다. == const

상수표현식은 전부 다 코드영역이다.

그래서 const를 붙이지 않은 코드영역에서 생성된 상수를 함수에서 사용하려면 받아오는 인자에 const가 있어야 사용이 가능하다.

 

지역변수 중에 const가 안붙은 것은 스택에 생긴다.

지역변수 중에 const가 붙은 것은 컴파일러에 따라서 상수가 될 수도 있고 스택에 만들어질 수도 있다.

 

char Arr[10] = "aaaaa";
const char* CPtr = Arr;
char* NPtr = Arr;

const가 붙어있지 않은 참조형 자료형에 const를 붙일 수는 있으나 const가 붙어있는 참조형 자료형에 const를 제거할 수는 없다.

const_cast라는 특별한 방법을 사용하면 거할 수는 있지만 강사님은 절대 사용안한다.

 

int b = 0;

const int* a = &b; 의 경우는 b는 수정 불가능하지만 a는 수정할 수있다.

a도 수정할 수 없게 하려면 const int* const a와 같이 사용하면 된다.

 


가변 인자

함수의 인자는 일반적으로 내가 정해준 갯수만큼만 넣어줄 수 있고 내가 정해준 갯수보다 적거나 많으면 에러가 난다. 이걸 해결하기 위한 것이 가변 인자이다.

가변 인자는 사용하는 순간 그 함수를 만들어내는게 가변 인자 함수다.

void VarTest(...)

 

변수의 위치는 8바이트씩 떨어져있는데 그 이유는 어떤 자료형도 C++에서 8바이트보다 크지 못하기 때문이다.

포인터의 더하기는 내 현재위치 + sizeof(자료형) * 넣어준 정수이다.

int* Ptr = &Count;

// 100번지 + sizeof(int) * 2 => 108
// 100번지 + sizeof(int) * 2
Ptr = Ptr + 2;

int Para0 = *Ptr;

Ptr += 2;

int Para1 = *Ptr;

 


 

프로그래밍 시에 주의할 점
  • const_cast는 절대 사용안한다.(코딩 스탠다드)
  • 어떤 함수든 사용하면 리턴값은 무조건 받아서 확인해다.(코딩 스탠다드)

'Unreal 강의' 카테고리의 다른 글

7일차 (12/19)  (0) 2023.12.19
6일차 과제  (0) 2023.12.18
5일차 과제  (0) 2023.12.15
5일차 (12/15)  (0) 2023.12.15
4일차 과제  (0) 2023.12.14