emplace_back() 사용하세요 c++ 벡터를 사용해 왔던 개발자 지망생들이라면 push_back() 을 많이 사용해 왔을 것이다. 결론부터 말하자면 그냥 모든 경우에서 emplace_back()을 사용하는 것이 좋다. 이름과 나이를 가지고 있는 고양이 클래스를 정의하고, 고양이 array를 가지고 있는 cats 를 만들어 보자. #include #include class Cat { public: Cat(std::string name, int age) :mName{ std::move(name) }, mAge{ age }{}; void speak() const { std::cout
전체 글
C#, 유니티 게임 개발자연속적인 메모리 공간을 heap에 가질 수 있는 벡터 컨테이너에 대해 조금 더 알아보자. Cppreference에서 vector를 검색해보면 time complexity에 대한 내용이 나온다. https://en.cppreference.com/w/cpp/container/vector std::vector - cppreference.com template class vector; (1) (2) (since C++17) 1) std::vector is a sequence container that encapsulates dynamic size arrays. The elements are stored contiguously, wh..
벡터란? : std::vector is a sequence container that encapsulates dynamic size arrays. 벡터는 연속적인 컨테이너인데 dynamic size array를 캡슐화 한 것 이란 뜻이다. Dynamic size array를 벡터를 사용하지 않고 만드는 법은 cpp를 어느정도 공부했다면 알고 있을 것이다. int main() { int* numsPtr = new int[5]; for (int i = 0; i < 5; i++) { numsPtr[i] = i; } delete numsPtr; }; 이렇게 int형 포인터를 만들고 for문을 통해 숫자를 넣어주고 delete를 통해 할당 해제해주면 된다. 그림으로 보면, 스택 위에 numsptr이란 포인터가 만..
반복자란? : C++ 라이브러리는 반복자를 제공하는데 이것을 사용하면 라이브러리의 방식대로 자료구조를 액세스 할 수 있다. 따라서 라이브러리가 효과적으로 동작한다는 것을 보장 할 수 있다는 장점이 있다. 즉, 포인터와 상당히 비슷하며, 컨테이너에 저장되어 있는 원소들을 참조할 때 사용한다. 추상적으로 말하자면, 반복자란 컨테이너에 저장되어 있는 모든 원소들을 전체적으로 훑어 나갈 때 사용하는, 일종의 포인터와 비슷한 객체라고 할 수 있다. 알고리즘 마다 각기 다른 방식으로 컨테이너를 훑어가기 때문에, 반복자에도 여러가지 종류가 있게 된다. 영어로 iterate라는 단어는 'to repeat a process, especially as part of a computer program' 이라고 사전적으로 정..
연산자 오버로딩이란? 오버로딩이란 기존 함수에 새로운 의미를 부여하거나, 파라미터를 추가하거나, 새로운 것을 만들어 낸다는 개념이다. 연산자 오버로딩은, 연산자도 하나의 함수처럼 생각하여 이를 오버로딩한다는 개념이다. 기존의 정의되어있는 데이터 타입을 우리가 만든 연산자에도 대해서 동작하게 하는 것이다. 즉, 연산자 오버로딩은 객체 지향 프로그래밍(OOP)에서 다른 연산자들이 함수 인자를 통해 구현되는 것을 말한다. 예를 들어, 덧셈 연산자는 정수가 들어올때도 동작하고, 실수가 들어올때도 동작하게 만들어져있다. 이러한 덧셈연산자를 우리가 정의한 데이터 타입에 대해서도 동작하게 하는것이 연산자 오버로딩 이다. 대부분의 연산자는 자식까지 상속이 된다. 결국, 기억해야 하는 것은 연산자 operator 는 그..
C++에서 함수형 프로그래밍을 지원하기 시작한 배경 C++ 언어의 스타일은 OOP, 즉 객체 중심 언어이다. 그런데 시간이 지나며 새로운 언어들이 생기고, 그런 새 언어들이 C++보다 더 쉽게 높은 언어 수준, 더 쉽게 OOP를 지원해주고 있다. 자연스럽게 C++는 OOP와 함께 높은 퍼포먼스가 필요한 곳에서 사용되어 왔다. 높은 퍼포먼스가 중요해지면 컴퓨터 구조상 자연스럽게 cach hit 을 계속 쳐줘야 한다. cache hit을 계속적으로 쳐주기 위해서는 data가 중심이 되는 data oriented programming 스타일이 자연스럽게 C++로 들어오게 되고, 자연스럽게 C++11부터 함수형 프로그래밍의 핵심 기능인 람다식 Lamda Expression을 지원해주기 시작했다. 그러면서 C++..
템플릿이란? : 변수에 타입을 정해주지 않고, 필요한 타입을 컴파일 시간에 정의해서 사용하는 개념. 비유적인 설명, (타 홈페이지에 잘 설명된 부분이 있어 인용) 개인적으로 비유를 들자면 펜중에.. 5색펜 이런거 있잖아요. 펜이 한자루 인데. 여러가지 색(자료형)을 우리가 그때그때 쓸 수 있잖아요. template는 여러개의 색(자료형)을 모아놓은 하나의 펜 케이스 그때그때 다른 색(자료형)을 눌러서 사용할 수 있다. 일반 자료형들이 [왼쪽] 펜들 이라고 생각한다면 -> [오른쪽]에 있는 펜 통! 이 Template 라고 생각하면 이해가 쏙쏙 ? 우리는 그때 그떄 필요할때마다. 각 색(int, double, string 등)을 넣어서 쓰면 됩니다. 출처: https://blockdmask.tistory...
결론: 사용하지 마세요 Dynamic Cast: RTTI (RunTime Type Information) 을 사용하는 것인데 대부분의 C++ 프로젝트에선 사용을 금지하고 있다. 구글 C++ 스타일 가이드의 RTTI 파트를 보면, Avoid using Run Time Type Information 부분에서 Dynamic Cast를 사용하지 말 것을 주문하고 있다. 이 접근 자체가 클래스 구조를 잘못 짠 것이고, 이런 RTTI가 없는 코드가 유지보수가 쉬운 코드라는 것이다. https://google.github.io/styleguide/cppguide.html Google C++ Style Guide Google C++ Style Guide Background C++ is one of the main de..