전체 글 122

상수 버퍼, 구조화 버퍼, D3D11_BUFFER_DESC

상수 버퍼 : CPU에서 write해서 GPU로 보내주면 GPU에서는 Read만 가능 구조화 버퍼 : CPU에서 접근 가능 여부를 설정해줄 수 있으며, 이에 따라 바인딩해줘야 하는 자원 뷰(Resource View)가 다르다. 사용자 정의 구조체로 구성할 수 있으며, 대용량 버퍼를 셰이더로 넘겨줘야 할 때 적합 D3D11_USAGE enumeration 설명 D3D11_USAGE_DEFAULT GPU Read & Write -> RWStructuredBuffer에 사용 D3D11_USAGE_IMMUTABLE Only GPU Read(CPU Access, GPU Write 불가) D3D11_USAGE_DYNAMIC CPU Write, GPU Read만 가능 -> 상수 버퍼와 StructuredBuffer에..

함수형 프로그래밍(Functional Programming)

함수형 프로그래밍이란? 순수 함수들로만 조합해서 프로그램을 완성하는 프로그래밍 패러다임. 여기서 순수 함수란 내부 상태를 갖지 않아서 같은 입력에 대해서 항상 같은 출력을 보장하는 함수 함수형 프로그래밍의 특징 및 장단점 불변성을 추구 불변성을 지향하는 프로그래밍 패러다임이다. 즉 변경 가능한 상태를 최대한 제거하려고 하는 언어. 다른 말로 순수 함수를 지향하는 프로그래밍 언어라고 하기도 하는데, 순수 함수란 위에서 언급했듯이 내부 상태를 갖지 않아서 같은 입력에 대해 항상 같은 출력이 보장되는 함수이다. 또 다른 표현으로는 side effect가 없는 함수라고 한다. side effect가 없는 함수의 예시로는 삼각 함수가 있다. 삼각 함수는 내부 상태가 없으며, 같은 입력이면 항상 같은 출력을 보장한..

공부/그 외 2022.09.26

C++ std::list vs std::vector

vector list 원소를 contiguous memory에 저장 -> cache friendly할 것임 원소를 non-contiguous memory에 저장 내부적으로 동적 배열로 구현 내부적으로 doubly linked list로 구현 default size가 있으며 그 default size를 넘어갈 때 추가 할당을 위한 비용이 크다 default size가 없다 원소 하나 저장하는데 원소 크기만큼만 필요 원소 하나 저장하는데 원소 크기와 더불어 next, previous 포인터에 대한 메모리도 필요 Random access가능 doubly linked list로 구현되어 있어서 Random access가 불가능해서 iterator로 순회해야함 Reference: https://www.educba..

공부/C || C++ 2022.09.26

std::sort와 list::sort는 왜 따로 있을까?

std::vector는 std::sort로 정렬되지만 std::list처럼 전용 sort함수가 없다. 반대로 std::list는 전용 sort가 있지만 std::sort는 사용할 수 없다. 그러면 왜 std::list는 std::sort를 사용할 수 없을까 알아봤다 stackoverflow를 찾아보니 std::sort는 랜덤 엑서스가 가능한 std::vector나 std::deque만 사용 가능하다고 한다. 그래서 당연하게도 연관 컨테이너(Associative Container)에도 사용이 불가능하다 std::sort는 quick sort, heap sort, Insertion sort를 조합한 알고리즘인 Intro sort를 사용해서 내부적으로 구현되어 있다. std::list::sort는 구현에 따라..

공부/C || C++ 2022.09.25

static 멤버 함수가 static이 아닌 멤버 참조가 안되는 이유, static 멤버 함수에서 this를 사용할 수 없는 이유

this에 관해 몰랐거나 알아도 정확한 이유를 몰랐던 것들 1. 멤버 함수 내에 this가 묵시적으로 삽입된다 Class Go { int num; public: void SetNum(int a) { this->num = a; } }; 위와 같은 클래스가 있으면 컴파일러는 묵시적으로 Class Go { int num; public: void SetNum(Go* this, int a) { this->num = a; } } 이런식으로 this를 삽입한다 2. static 멤버 함수 내에서 this를 사용할 수 없는 이유 하지만 static 멤버 함수에 대해서는 this를 삽입하지 않아서 static 함수내에서 this를 사용할 수 없다. 왜 static 함수에 대해선 this를 삽입해주지 않는가? this는 ..

공부/C || C++ 2022.09.25

C++ 클래스 상속, 다중 상속, 가상 함수 그리고 다형성(Inheritance & virtual function & polymorphism)

C++ 클래스와 상속 그리고 큰 특징 중 한가지인 다형성에 대해 알아볼 것이다. 그전에 상속과 관계 없지만 조금 신기한 것을 알게 됐는데, 아래처럼 클래스를 정의해놓고 아무런 멤버 변수를 선언하지 않고 size를 확인하면 신기하게도 1이 나온다. class CTest1 { }; struct CTest2 { }; int main() { CTest1 test1; CTest2 test2; std::cout

공부/C || C++ 2022.09.25

static 변수와 전역 변수와 비교

static 변수 전역 변수 메모리 생성 시점 프로그램 시작 프로그램 시작과 동시에 생성 및 초기화 메모리 소멸 시점 프로그램 종료 프로그램 종료 디폴트 초기값 0으로 자동 초기화 0으로 자동 초기화 접근 가능 범위 - 정적 지역 변수 : 중괄호 내부에서만 접근 - 정적 전역 변수 : 선언된 소스 파일 내부에서만 접근 가능 프로그램 전체에서 접근 가능 메모리 할당 공간 초기값이 있을 경우 : Data 초기값이 없을 경우 : BSS 초기값이 있을 경우 : Data 초기값이 없을 경우: BSS 초기화 횟수 딱 한번만 초기화 클래스 멤버의 경우 클래스 내부에서 초기화가 불가능해서 외부에서 해줘야 한다 Ex) ClassA::Statc_변수_이름 = 0; static 변수와 전역 변수의 초기화 시점에 관한 내용은..

공부/C || C++ 2022.09.23

멀티바이트(Multibyte), 유니코드(Unicode), ANSI 그리고 ASCII

먼저 "유니코드와 멀티바이트를 비교하라" 는 질문을 받았고 간단하게 대답을 하려면 멀티 바이트는 문자를 다양한 바이트로 표현하는 인코딩 방식 유니코드는 세계 모든 문자를 2바이트 길이의 바이너리(=코드)와 매핑해놓은 코드표(=문자열 셋)이다(예를 들어 '가' 라는 문자를 U+AC00 이런식의 코드에 매핑) 이렇게 대답하면 좋을 것 같다. 앞서 유니코드와 멀티바이트를 비교 하려고 하는데 엄밀히 이야기하면 비교 대상이 잘못됐다. 명확한 비교는 WBCS과 MBCS(흔히 말하는 멀티바이트)를 비교해야한다(유니코드가 WBCS의 형태라서 이렇게 통상적으로 비교하는 듯 하다). 먼저 문자열 셋(Chracter Set)과 인코딩에 대한 이해가 필요하다. 문자와 바이너리를 매핑시켜주는 표를 문자열 셋(Character ..

공부/그 외 2022.09.23

3D OBB 충돌 코드 및 설명

분리축 이론 : 다면체 A, B에 대해서 어떤 축이 존재해서 그 축으로의 다면체들의 투영된 구간이 "하나라도" 서로 겹치지 않는다면 A, B는 서로 분리되어 있다는 이론 bool CCollision::CollisionBox3DToBox3D(CollisionResult& SrcResult, CollisionResult& DestResult, const Box3DInfo& boundingBox, const Box3DInfo& targetBox) { double c[3][3]; double absC[3][3]; double d[3]; double r0, r1, r; int i; const double cutoff = 0.999999; bool existsParallelPair = false; Vector3 d..

C++17 string_view

c++17에 string_view라는 기능이 추가되었다. 이 기능을 사용하면 좋은 점을 예시로 살펴보자 // 원래 사용하던 방식 std::string FiveCharacterOnlyString(const std::string& str) { if (str.size() < 5) return str; return str.substr(0, 5); } // c++ 17 string_view // string_view를 사용하면 string 객체의 복사가 발생하지 않습니다. std::string_view FiveCharacterOnlyStringView(const std::string_view str) { if (str.size() < 5) return str; return str.substr(0, 5); } in..

공부/C || C++ 2022.09.19