[내일배움캠프 Unity 9기]

04/25 복습내용

kyvv 2025. 4. 25. 21:25

c++ 및 서버 환경 관련 내용 정리

✅ 1. 컴파일과 실행 최적화

  • 디버그 vs 릴리즈
    • 릴리즈에선 불필요한 코드 제거 및 최적화.
    • 디버그에선 존재하던 코드가 릴리즈에서 사라질 수 있음.
  • .pdb 파일: 소스코드와 기계어의 매핑 정보 포함 → 디버깅 시 중요.
  • inline 최적화
    • __inline만 강제 인라인 가능.
    • 너무 과도한 인라인은 오히려 코드 부풀림.
  • volatile: 최적화된 코드에서 예상 못한 제거를 방지하기 위한 키워드.

✅ 2. 시간/타이머 관리 (게임/서버 중심)

  • 타이머 종류
    • clock(): C 표준 함수, 초 단위.
    • GetTickCount() / GetTickCount64(): 밀리초, 경량 호출.
    • timeGetTime(): 더 정확한 시간(정밀도 설정 필요).
    • QueryPerformanceCounter(): 고해상도, Frequency와 함께 사용.
  • 정밀도 향상
    • timeBeginPeriod(1) → 타이머 인터럽트를 1ms로 설정.
    • 게임 서버는 이 설정이 필수. 일반 서버는 선택.
  • 프레임 처리
    • MMO: 10fps, RPG: 30fps, 일반적 서버: 60fps 이상.
    • sleep(20 - 로직수행시간) 구조로 사용.
  • 주의사항
    • 고해상도 타이머는 멀티코어 환경에서 정확도 떨어질 수 있음.
    • chrono는 C++ 표준 타이머 → 내부적으로 QueryPerformanceCounter 사용.

✅ 3. 메모리 구조 및 관리

  • 메모리 영역
    • 코드(.text), 데이터(.data), 힙, 스택 등.
  • 동적 할당 흐름
    • new → malloc → HeapAlloc → VirtualAlloc(4KB 페이지).
  • 패딩 및 정렬
    • 구조체 정렬은 변수 타입 기준.
    • alignas(32)로 메모리 경계 지정.
  • 에러 발생 조건
    • 널 포인터 접근, 읽기 전용 메모리 쓰기, 할당되지 않은 영역 접근.

✅ 4. 함수 호출 규약

  • 호출 규약 종류
    • __cdecl: 호출자가 스택 정리 (가변 인자 사용 가능).
    • __stdcall: 피호출자가 스택 정리 (WinAPI 기본).
    • __fastcall: 레지스터를 최대한 활용.
  • 인자 전달 순서
    • 대부분 RTL (오른쪽 인자부터 전달).
    • 리턴값은 기본적으로 eax를 통해 반환됨.
  • 매크로 함수 문제 해결
    • 매크로 내부에 do{}while(0) 사용 → 구문 오류 방지.

✅ 5. 디버깅 & 덤프 분석

  • 덤프 파일 생성 방법
    • 작업 관리자 > 프로세스 > 덤프 생성
  • 덤프 분석
    • .pdb와 소스코드가 있으면 주소 매핑 가능.
    • Native Debug로 실행 시 전체 메모리 상태 확인 가능.

✅ 6. 랜덤/시간 관련 처리

  • 난수 생성
    • rand()는 의사 난수 → srand()로 시드 설정 필요.
    • 보안성이 필요한 경우 rand_s() 또는 C++ random 권장.
    • time(nullptr)를 시드로 사용 → 매번 다른 값 생성.
  • 리플레이 구현
    • 모든 상태를 저장하는 것이 아니라 입력과 시드만 저장해도 가능.

✅ 7. 기타 실전 팁

  • switch-case 최적화
    • 케이스 수가 많을 경우 → 점프 테이블 사용.
    • 조건이 적으면 → if-else로 변환됨.
  • 레지스터 구조
    • rax > eax > ax > al/ah → 하위 8~64bit 활용.
  • 문자열 파싱
    • strtok() 사용 시 멀티스레드 환경에서는 사용 주의.