TIL

Kyu_·2일 전

36주차

목록 보기
1/2

오늘 진행한것

  • DirectX 스터디 시작
  • 인라인함수, 컴파일단계
  • 코드카타

다이렉트 X 스터디

기본 문법들

  • HWND

    • 윈도우 창을 가리키는 핸들, 이 창을 Windows에 알려줄때 사용
  • HINSTANCE

    • 실행중인 모듈을 가리키는 핸들, 아이콘, 창 클래스 같은 프로그램 리소스를 등록할 때 사용
  • LPCWSTR

    • 유니코드 문자열 포인터 타입
    • L : long, 여기서는 wide character
    • PC : pointer to const
    • WSTR : wide string
  • LRESULT

    • Windows 메시지를 처리한 뒤 Windows에 돌려주는 결과값 타입

개념

  • PeekMessage와 GetMessage
    • PeekMessage : 논블로킹, 메시지가 없으면 바로 게임루프 돌릴 수 있음
    • GetMessage : 블로킹 함수라 메시지가 올때까지 멈춤
    • 실시간 렌더링에서는 PeekMessage

아스키, 유니코드, utf8, utf16차이점, 언리얼 텍스트 매크로는 뭐냐

CS

개념

인라인 함수

솔직히 왜쓰는지 제대로 이해도 안가고 잘 몰랐는데 확실히 공부해야겠다고 생각해서 찾아봄

일반함수는 컴파일 후 개념적으로

result = Add(1, 2); // Add함수의 기계어 주소로 점프(call)

Add의 구현은 다른 .cpp에 있어도, 컴파일,링크 과정에서 함수의 기계어 주소가 연결된다. CPU는 파일을 찾는게 아니라 해당 주소로 바로 점프

인라인 함수는 구현을 헤더에 두어 호출하는 .cpp가 컴파일시 함수 본문을 볼 수 있게 한다. 그러면 컴파일러가

result = Add(1, 2);
// 위를 다음과 같이 판단한다.
result = 1 + 2;

Add함수로가서 계산하고 호출하는쪽으로 오는게 아니라, 함수 호출자리에 함수 본문을 직접 삽입하는 식으로 계산됨

컴파일 과정

C++에서 h와 cpp는 컴파일 단계를 알아보자

// Math.h
int Add(int a, int b)
// Math.cpp
#include "Math.h"

int Add(int a, int b){
    return a + b;
}
// Main.cpp
#include "Math.h"

int main(){
    return Add(1, 2);
}
  1. 전처리 단계
    #include "Math.h"는 해당 헤더 내용을 코드에 그대로 붙여넣는것 처럼 처리된다.
int Add(int a, int b)

int main(){
    return Add(1, 2);
}

Math.cpp도 마찬가지로 헤더 선언을 포함한 상태에서 컴파일 된다.

  1. 컴파일 단계

각 .cpp파일은 서로 독립적으로 컴파일 된다.

  • Main.cpp는 Add의 선언을 보고 이런 함수가 어딘가에 있다만 알고 Add 호출 코드를 만든다.
  • Math.cpp는 Add의 실제 구현을 보고 Add 함수의 기계어 코드를 만든다.

이 결과가 각각의 .obj 목적파일이 된다.

  1. 링크 단계

링커가 Main.obj와 Math.obj를 합침

  • Main.obj에는 Add함수가 필요하다는 참조가 있음
  • Math.obj에는 실제 Add함수 구현이 있음

링커가 둘을 연결해 최종실행파일을 만듬
실행할때는 .h나 .cpp파일을 읽지 않음. 최종 실행파일안에 이미 Add의 기계어 코드와 그 위치 정보가 들어있다.

인라인함수

// Math.h
inline int Add(int a, int b){
    return a + b;
}

인라인 함수는 이런식으로 헤더에 구현을 둔다. 그러면 Main.cpp를 컴파일할때 Add의 구현도 보이므로 컴파일러가 호출위치에 a+b 계산 코드를 직접 넣는 인라인 최적화를 할 수 있다.

코드카타

[1차]캐시

#include <string>
#include <vector>
#include <list>
#include <algorithm>
#include <cctype>

using namespace std;

int solution(int cacheSize, vector<string> cities) {
    int answer = 0;
    list<string> cache;

    if (cacheSize == 0) return cities.size() * 5;

    for (string& city : cities){
        transform(city.begin(), city.end(), city.begin(), ::tolower);
        auto it = find(cache.begin(), cache.end(), city);

        if (it != cache.end()){
            answer++;
            cache.erase(it);
            cache.push_front(city);
        } else {
            answer+=5;
            if ((int)cache.size() == cacheSize){
                cache.pop_back();
            }
            cache.push_front(city);
        }
    }

    return answer;
}
  • algorithm안에 transform이랑 find가 들어감
  • find와 .find의 차이
    • find는 vector나 list같은 반복자(begin/end)를 제공하느 거의 모든 컨테이너에서 사용가능
    • .find는 컨테이너가 직접 제공하는 멤버 함수, set, map등에 사용함
  • cctype은 tolower를 처리하기 위해 사용

0개의 댓글