전체 글 122

C++ vector::push_back vs vector::emplace_back

지난 게시글인 Rvalue reference관해서 공부하다가 우연히 보게 된 건데 C++에 container들을 자주 써왔다고 생각했는데 push_back과 emplace_back에 performance 차이가 있을 수 있다는 이야기는 처음 들어봤다. 사실 emplace_back은 거의 안써보고 매번 push_back만 쓰기도 했다. 겉보기에 두개의 메소드 간에 차이가 없어보이는데 왜 다른 이름으로 두개가 존재하는건지 진작에 의문점을 가져봤어야 했는데... push_back과 emplace_back의 가장 큰 차이점은 "emplace_back은 내부적으로 가변 인자 템플릿 형태의 생성자가 구현되어 있다는 점이다" 그래서 결과적으로 두 함수에 생기는 차이는 push_back은 내부적으로 생성자가 없어서 외..

공부/C || C++ 2022.09.18

그림자 매핑(Shadow Mapping)

여기서 소개할 그림자 매핑은 최근 사용되는 그림자 매핑 기법중에 가장 기본이되는 기법이다. 사실 이 기법을 기반으로 발전된 여러가지 고급 기법들이 다음과 같이 이미 나와있다. 캐스케이드 그림자 맵 : 그림자 매핑의 해상도 문제를 해결하기 위하여 영역별로 여러개의 그림자맵을 만드는 기법 퍼센티지 클로저 필터링 : 그림자의 외곽선을 부드럽게 필터링 해주는 기법 배리언스 그림자맵 : 하드웨어 텍스처 필터링이 가능하도록 깊이 값을 저장하는 방법 그림자가 생기는 원리 아래 그림 기준으로 1번 빛에서는 D앞에 가리는 물체가 없으므로 그림자가 생기지 않는다. 2번 빛은 B앞에 A라는 물체가 가리고 있으므로 2번 광선이 B의 표면에 만나는 지점에 그림자가 생길 것이다. C도 마찬가지로 A, B 물체에 가리니까 그림자가..

STL Container (시퀀스 컨테이너, 연관 컨테이너, 컨테이너 어댑터)

C++ 표준 라이브러리에는 많은 종류의 라이브러리가 존재한다. 예를 들어 입출력 라이브러리(iostream 등), 시간 관련 라이브러리(chrono) 등이 있다. 특히 C++ 템플릿 라이브러리(Standard Template Library)는 다음 세 개의 라이브러리들을 의미한다 임의 타입의 객체를 보관할 수 있는 컨테이너 라이브러리(container) 컨테이너에 보관된 원소에 접근할 수 있는 반복자(iterator) 반복자들을 가지고 일련의 작업을 수행하는 알고리즘 위에서 볼 수 있듯이, 컨테이너에 임의 타입의 객체를 보관할 수 있다고 한다. 임의 타입의 객체를 보관할 수 있는 이유는 템플릿으로 구현되어 있기 때문이다. 따라서 int, string 같은 기본적인 자료형이 아닌, 사용자가 직접 만든 클래..

공부/C || C++ 2022.09.17

자료구조 별 장단점(vector, list, queue, stack, map, hash map, tree)

vector list 장점 1. 일반 배열처럼 연속적인 메모리에 저장돼서 Index로 빠르게 접근 가능 2. 동적으로 메모리가 확장되는 기능 1. 어느 위치에서든 삽입/삭제가 빠름 단점 1. 중간 삽입/삭제가 느림 2. 확장이 필요할 때에 메모리 재할당과 복사로 비용 발생 -> Move Semantic으로 커버 가능 1. Index로 접근 불가능 stack queue 장점 1. LIFO 로 원소가 필요할 때 사용 가능 2. top에 위치한 원소에 빠르게 접근 가능 1. FIFO로 원소가 필요할 때 사용 가능 2. front에 위치한 원소에 빠르게 접근 가능 단점 1. 중간에 위치한 원소에 대해 접근 불가능 1. 중간에 위치한 원소에 대해 접근 불가능 hash_map tree 장점 1. Key값을 이용해서..

Lighting

Lighting - 빛과 Object간의 상호 작용 Direction Light Source - 아주 멀리서 오는 Sun(해)라고 생각하면 됨. - 이제부터 설명하는 모든 Light의 종류는 Direction Light Source라고 가정하고 설명할 것임 - 아주 멀리서 오는 빛이기 때문에 오브젝트의 모든 점에 들어오는 빛은 같은 방향과 입사각으로 들어온다고 가정 Phong Light Model - 대표적 Lighting Model - Phong Model은 4가지 Term으로 이루어짐 1. Diffuse(난반사, = Lambert) - 온갖 방향으로 동일한 양의 빛을 반사. - 온갖 방향으로 동일한 양으로 반사된다는 것은 우리가 카메라를 어디 두던간에 같은 색으로 보인다는 의미. - 우리가 "어떤 물..

객체 지향 프로그래밍(OOP)

객체 지향 프로그래밍이란? 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호 작용을 통해 프로그램을 만드는 것 객체란? 클래스라는 틀(template)에서 생겨난 실체(Instance) 객체 지향 프로그래밍을 사용해야 하는 이유는? 실세계에 대한 쉬운 모델링 응용 소프트웨어를 하나의 절차로 모델링 하기는 어렵다. 대부분의 응용 소프트웨어 특성상 절차보다는 관련된 여려 객체들간의 상호작용으로 모델링하는 것이 더 쉽고 적합하다 생산성 상속과 다형성으로 이미 만들어진 클래스를 기반으로 재정의해서 사용할 수 있고, 캡슐화로 만든 클래스를 실체화 시킨 객체를 계속해서 만들어낼 수 있다 보안성 캡슐화로 구현된 클래스에서 특정 부분을 은닉할 수 있다 SOLID (객체 지향 설계 원칙) 1. 단일 책임 원칙..

공부/그 외 2022.09.11

Instruction Pipeline, Hazard 그리고 Branch Prediction

Instruction Pipeline - 명령어 파이프라인(Instruction Pipeline)은 순차적으로 명령어를 읽어 실행하는 프로세서에 적용되는 기술로, 한번에 하나의 명령어만 실행하는 것이 아닌, 하나의 명령어가 실행되는 도중에 다른 명령어 실행을 시작하는 식으로 동시에 여러개의 명령어를 실행하도록 해서 CPU가 프로그램 처리하는 성능을 높혀줄 수 있도록 하드웨어적으로 구현되어 있는 기능 명령어 처리에는 기본적으로 5단계로 이루어져 있다(단, 모든 명령어들이 위 과정을 모두 거치는 것은 아니다) 1. IF: 메모리로부터 Instruction Fetch (메모리로부터 명령어 불러옴) 2. ID: Instruction Decode & register read (명령어 해석, 레지스터 read) 3..

Call Stack, Callee/Callee-saved register

Call Stack 이란? - 실행중인 함수에 관한 정보를 담아 놓은 스택구조의 데이터 구조이다 예시 예를 들어 call_incr() 함수 내부에서 incr() 함수를 호출하는 상황에 대한 assembly과 call stack을 보자 먼저 용어에 대한 정리가 필요하다. A 함수 내부에서 B 함수를 호출할 때, A 함수를 Caller, B 함수를 Callee라고 부른다. 아래 예시에선 call_incr() 함수가 Caller, incr() 함수가 Callee 이다 그냥 단순한 incr 함수 내부 어셈블리다. 아래에서 call stack을 살펴보자 1. 먼저 call_incr() 함수 내부의 지역변수를 v1을 스택에 저장하는 모습이다 2. incr() 함수 호출에 필요한 인자를 레지스터로 넘겨주고 있다. 사..

시스템 콜(System Call)

시스템 콜(System Call)이란 - 운영 체제의 커널이 제공하는 서비스. 응용 프로그램의 요청에 따라 커널에 접근하는 인터페이스이다. 시스템 콜이 필요한 이유 - 우리가 사용하는 응용 프로그램은 보통 유저 모드(User Mode)에서 실행되므로 유저 프로세스인데, 이 유저 모드에서 가능한 기능만으로는 많은 기능들을 구현하기 힘들다. 따라서 시스템 콜을 이용해서 유저 모드에서 커널 모드로 전환한 후에 커널이 제공하는 기능들을 사용해야 한다. 시스템 콜 유형 1. 프로세스 제어(Process Control) - fork(), exit(), kill(), malloc(), free() 등 2. 파일 조작(File Manipulation) - open(), close(), read() 등 3. 장치 관리(..

공부/운영체제 2022.09.06

C++ std::move

C++ 11에서 Rvalue reference를 공부하다보니 처음보는 개념들이 너무 많이 쏟아져 나온다. 그중 하나가 std::move이다. 기능은 쉽게 이야기해서 lvalue를 rvalue로 전환해주는 것이 전부이다. 다만 B = std::move(A)를 한다면, A는 아무런 값도 갖지 않은 객체가 된다는 것을 인지해야한다. 이름이 move라고 해서 값을 옮겨준다거나 그렇게 하진 않는다. std::move는 주로 move 생성자에 많이 쓰인다. 아래 코드를 보면 왜 move 생성자에서 자주 쓰이는지 알 수 있다. (코드 출처 : https://openmynotepad.tistory.com/10) class Item { public: Item(const int _n) : m_nx(_n) { cout

공부/C || C++ 2022.09.05