묻공러
'C++/[노코프] Tips' 카테고리의 글 목록

C++/[노코프] Tips

C++/[노코프] Tips

[C++ Tips] Data oriented Programming

빠르게 연산을 해서 decision making을 해야 하는 분야인 경우에는 OOP로 컨셉으로 코드를 작성했다면, Memory Access Time으로 인해 피해를 볼 수 있다 C++를 사용하는 이유는 기본적으로 OOP와 performance를 둘 다 잡기 위해서 사용한다 하지만 위처럼 performance가 중요한 분야인 경우에는 OOP를 반드시 버려야 한다 아래의 코드는 OOP로 인해 performance에 문제가 발생하는 경우이다 price의 평균을 구해야 하는 경우에 반복문이나 람다 함수를 이용하면 된다고 생각할 수 있지만 이는 매우 느리다는 것이 문제이다 #include #include class Stocktrading { public: // private: int price; int id; s..

C++/[노코프] Tips

[C++ Tips] Early Return

GPU 프로그래밍에서는 Early Return이 필수이다 CUDA의 경우에 하나의 warp에 16개의 thread가 동시에 연산을 처리한다 그중 한 개의 thread가 다른 작업을 한다면 나머지 thread들은 wait 상태로 있어야 한다 따라서, GPU 프로그래밍에서는 thread가 더 이상 필요하지 않으면 warp에서 thread를 없애주는 방식으로 코드를 작성하는 것이 당연하다 이를 CPU 프로그래밍에서 활용하면 성능 향상과 코드 가독성을 보장하고 오류 처리가 더욱 쉬워진다 Early Return을 사용하지 않는 일반적인 코드는 아래와 같다 bool vaccinate(Cat& cat) { if (1

C++/[노코프] Tips

[C++ Tips] Function Overloading

함수 오버로딩은 매개변수의 종류 및 개수가 다른 경우에만 허용된다 반면, 반환 타입은 함수 오버로딩에 영향을 미치지 않는다 그 이유는 1) 호출 시 함수를 식별하는 기준 : 함수를 호출할 때 컴파일러는 함수의 이름과 매개변수 목록을 기반으로 호출할 함수를 식별한다 반환 타입은 이러한 함수 식별 과정에서 고려되지 않는다 2) 호출 시 반환 값의 사용 : 함수를 호출한 곳에서 반환 값을 사용하지 않을 수도 있다 따라서 반환 타입만으로는 함수 오버로딩이 결정되지 않는다 3) C++ 문법의 간결성 : C++의 문법은 간결하고 명확해야 한다 반환 타입이 함수 오버로딩에 영향을 미친다면 코드를 이해하기 어려워질 수 있다 따라서 C++에서는 함수 오버로딩에는 반환 타입이 고려되지 않으며, 함수의 이름과 매개변수 목록..

C++/[노코프] Tips

[C++ Tips] 싱글톤

자바나 파이썬과 같은 모던 랭귀지들은 싱글톤 키워드만 사용하면 쉽게 싱글톤 패턴을 구현할 수 있다 하지만 C++에서는 싱글톤을 만들기 위해 조금 복잡하게 구현해주어야 한다 싱글톤은 단 하나의 오브젝트만 만들어서 사용하는 경우에 이용한다 싱글톤을 구현할 때, 오브젝트는 힙에 할당하고 포인터를 데이터 공간에 선언해 놓고 해당 포인터를 반환해서 사용하는 싱글톤 형태의 문제점은 해당 포인터에 nullptr를 넣거나 해당 포인터를 free를 통해 해제한다면 문제가 발생한다 따라서, 데이터 공간에 오브젝트를 생성하고 레퍼런스로 가져와서 사용하는 것이 가장 안전하다 #include class Singleton { public: static Singleton& getInstance() { static Singleton..

C++/[노코프] Tips

[C++ Tips] static

static은 link의 개념과 scope block의 개념으로 구분되는데 static - link의 개념은 간단하게 internal linkage를 의미하고 아래의 링크를 참고하면 된다 https://motivelessstudy.tistory.com/313 static - scope block의 개념은 일반적인 static과 static member variable/function로 구분된다 1) 일반적인 static 초기화가 단 한 번만 실행된다 #include void func() { static int a = 0; std::cout

C++/[노코프] Tips

[C++ Tips] extern vs. static

static은 link의 개념과 scope block의 개념으로 구분되는데 여기서는 link의 개념을 의미한다 extern은 external linkage이고 static은 internal linkage이다 extern은 다른 어딘가 정의돼있을 것이라고 알려주는 용도로 사용된다 이는 외부와 link해서 사용하도록 하는 것이다 // main.cpp #include extern int a; int main() { std::cout

C++/[노코프] Tips

[C++ Tips] std::string

# std::string의 size std::string의 size는 오래된 컴파일러의 라이브러리에서는 8byte 모던 STL에서는 32byte or 40byte를 차지한다 # std::string의 내부 구조 8byte인 경우는 스택에 std::string의 8바이트 주소를 가지고 있고 힙에 "abc"가 있고 끝 부분에 size와 capacity가 포함된다 32byte or 40byte인 경우는 스택에 std::string의 8바이트 주소와 size, capacity, 그 외의 정보 정보가 들어가고 힙에 "abc"가 있다 # std::string의 문제 자주 쓰이는 변수 타입들은 대부분 스택에 들어간다 그러나 std::string은 힙에 할당이 되기에 속도와 효율의 문제가 발생한다 이를 해결하기 위해서..

C++/[노코프] Tips

[C++ Tips] 상속

OOP의 문제는 Base 클래스를 뜯어고쳐야 하는 상황이 오면, Derived 클래스들도 모두 뜯어고쳐야 한다는 것이다 또한, 특정한 Derived 클래스들을 Base 클래스로부터 분리해야 하는 경우에도 굉장히 복잡해지며 유지 보수가 어려워 진다 따라서, 아래와 같은 Dynamic function binding이 정말 필요한지 생각을 해봐야 한다 Animal* animal; if (rat)// Dynamic function binding { animal = new Cat(); } else if(thief) { animal = new Dog(); } Dynamic function binding이 필요 없다면 상속 없이 클래스를 만들고 각자의 멤버 변수와 함수를 이용하는 것이 유지 보수가 더욱 좋다

C++/[노코프] Tips

[C++ Tips] Virtual Function

Virtual function은 dynamic function binding이며 런타임 중 바인딩이 된다 function overloading은 static function binding이며 컴파일 시 바인딩이 된다 virtual 키워드가 사용되면 virtual table pointer (8바이트)가 추가되고 그에 맞게 padding이 진행되어 사이즈가 결정된다 virtual table pointer를 타고 가면 나오는 virtual table에 해당하는 클래스의 멤버 함수들이 저장되어 있기 때문에 부모 클래스로 자식을 생성하더라도 자식 멤버 클래스가 실행이 된다 또한, 아래의 코드에서 볼 수 있듯이 런타임 중 발생하는 상황에 따라서 바인딩이 달라질 수 있다 #include #include class B..

C++/[노코프] Tips

[C++ Tips] 클래스/구조체 멤버 정렬

아래의 글을 참고하면 된다 https://motivelessstudy.tistory.com/209 [C] 바이트 정렬 바이트 정렬 요구사항 시스템 별로 메모리에 효율적으로 접근하기 위해서 n 바이트 배수인 시작 주소에서만 메모리 접근이 가능하게끔 한다 예를 들어, x86 시스템은 4바이트 단위로 읽어오고 4 motivelessstudy.tistory.com