공부 기록

2024/10 MIL

서니션 2024. 11. 1. 10:39

비트플래그는
rpg에서 상태이상 같은 곳에서 쓰임
flag (1 << 2) 이런 느낌

vs에서 ctrl alt d하면 어셈블리 볼 수 있음

define보다는 const나 enum형을 우선으로 사용
ㄴ 그냥 바꿔치기라서

1.enum 2.const 3.define 순서

전역변수X, 포인터


구조체 내부에서
변수를 만들어 호출하면
복사가 일어나 느림

포인터로 하면 주소에 바로 저장되어 빠름

구조체가 1000바이트짜리 대형 구조체라면?
- 값) StateInfo 1000바이트 복사
- 주소 StatInfo* 8바이트
- 참조 StatInfo& 8바이트

참조 전달 방식은
- 값 전달처럼 편리하게 사용하고
- 주소 전달처럼 주소값을 이용해 진퉁을 건드리는
- 일석이조의 방식!

포인터 vs 참조 세기의 대결
- 성능 : 똑같음
- 편의성 : 참조 승 (.을 찍어서 일반 변수처럼 사용가능)

편의성이 좋다는게 꼭 장점만은 아니다.
포인터는 주소를 넘기니 확실하게 원본을 넘긴다는 힌트를 줄 수 있음
참조는 자연스럽게 모르고 지나칠 수 있음
참조는 const를 사용해서 마음대로 고치는 부분 개선 가능
(포인터도 사용 가능하긴 함)

초기화 여부
- 참조 타입은 바구니의 2번째 이름
-> 참조하는 대상이 없으면 안됨
- 포인터는 아무런 값도 없어도 괜찮지만,
참조는 이런 부분이 안 됨
- 포인터에서 '없다'는 의미는 ? null 이나 0도 되지만 nullptr을 추천

뭘 쓸거냐? 정해진 답은 없음 . 팀바이팀
-구글에서는 포인터를 좀 더 선호하는 것 같고
언리얼 엔진에선 레퍼런스도 애용
- 없는 경우를 체크해야 한다면 nullptr을 쓸 수 있는 포인터 사용
- 바뀌지 않고 읽는 용도(readonly)라면 const ref&
- 바뀐다하면 OUT ref& info 하고 #define OUT -> 함수(OUT info);
-- 다른 사람이 포인터로 한걸 이어서 만든다면 계속 포인터


피보나치
int fibonacci(int n)
{
if (n <= 1)
return n;

int prev = 0, curr = 1, next;
for (int i = 2; i <= n; i++)
{
next = prev + curr;
prev = curr;
curr = next;
}
return curr;
}



[모던 C++]
1. Auto
변수를 컴파일 단계에서 추론을 해서 찾아줌
일종의 조커카드
말이 되게 잘 맞춰봐~

가독성 손해

2. 중괄호 초기화
vector는 원래 배열처럼 {}로  못했는데 할 수 있게 되었음

3. nullptr
 없는 ptr

4. using
type define 대신 사용할 수 있는 것이 using이다
직관성, 템플릿

5. enum clas
scoped enum
- 이름공간 관리, 암묵적인 변환 금지
- 기본 이넘을 unscoped enum (범위 없는) 이넘이라고 함

고정적인 부분에서는 변환 가능

6. delete (삭제된 함수)
private지만 friend class로 넘겨줄 수 있음
모든 것을 뚫는 창 vs 절대 방패

함수 뒤에 =delete 붙여주면 됨

7. override, final
가상함수와 연관있음
오버로딩 : 함수 이름 재사용

ㅡㅡㅡ

스마트 포인터

간접적 활용

포인터를 알맞는 정책에 따라 관리하는 객체
(포인터를 래핑해서 사용)

shared_ptr, weak_ptr, unique_ptr
언리얼에서는 비슷한 클래스를 지정해두었음

shared_ptr
아무도 이 포인터의 존재를 까먹었을 때 delete
- 전통적인 사이클 문제 발생, 메모리가 영영 해제되지 않고 크래시 상황 발생

weak_ptr
- 간접적으로 이 ptr이 삭제되었는지 확인

unique_ptr
- 전 세계에서 정말 나만 이 ptr을 가져야함
- 다른 애한테 주려면 move(ptr) 이렇게 써서 모든 걸 넘겨주어야함


make_shared 메모리 블록을 한 번에 만들어주는 것 (나중ㅇ ㅔ배움)

생ptr을 넘기는 경우는 이제 거의 없음