Programming(72)
-
C++ cast들 (static_cast, reinterpret_cast, dynamic_cast, const_cast)
static_cast static_cast는 C의 기본 cast와 동일합니다. 그렇다면 왜 static_cast를 사용해야 할까요? C의 기본 cast는 data type의 bit width를 무시합니다. 즉, 더 많은 bit를 사용하는 변수에서 더 적은 bit를 사용하는 변수로 casting을 하게되면 부족한 bit에 대한 값을 잃게되는 narrowing 문제가 발생합니다. C++의 static_cast를 사용하게되면 이런 문제를 예방 (compile 단계에서 오류 발생) 할 수 있습니다. static_cast는 다음과 같이 사용할 수 있습니다. std::shared_ptr sp(static_cast(malloc(sizeof(int))), free); reinterpret_cast type을 변환하는 ..
2023.02.09 -
C++ emplace_back
clss Item { public: ... private: uint32_t size; std::string name; }; std::vector items; items.push_back(Item(20, "item1"));push_back은 객체를 복사하여 저장합니다. 즉, 입력으로 주어지는 임시객체는 복사된 뒤 바로 파괴됩니다. 반면에 emplace_back은 move 할당자가 정의되어 있을 시 이를 활용하여 임시객체를 move 한 객체를 저장합니다. emplace_back을 사용해도 객체가 move 할당자를 정의하고 있지 않다면 push_back과 마찬가지로 객체 생성 후 복사를 수행합니다. emplace_back을 효과적으로 사용하고자 한다면 다음과 같이 move assignment operator를..
2023.02.03 -
C++ 대입연산자의 virtual 사용
class Animal { public: Animal& operator=(const Animal& rhs); }; class Bird: public Animal { public: Bird& operator=(const Bird& rhs); };이제 Bird를 잘 못 사용하는 예를 살펴보겠습니다. Bird b1; Bird b2; Animal *pa1 = &b1; Animal *pa2 = &b2; *pa1 = *pa2;위와 같이 치환하게 되면 Base class인 Animal의 치환연산자는 virtual로 선언되지 (vtbl을 생성 하지) 않았으므로, Bird의 치환을 예상했지만, Bird가 가지고 있는 Animal의 치환연산자만 호출됩니다. 즉, Animal의 내용만 치환되게 됩니다. 이렇게 포인터를 직접..
2023.01.29 -
미래지향적인 C++ 프로그래밍
변화를 받아들이고 변화에 대비하는 것입니다. 즉, 내가 작성한 프로그램이 늘 항상 변화될 수 있다는 가능성을 열어두고, 이대로 고정일거라는 한계를 짓지 말아야 함을 의미합니다. 클래스가 파생될 것이라는 '확신' 이 있다면 당장 그 함수를 재정의하지 않더라도 가상 함수로 만들어도 됩니다. 그러나 확신이 서지 않는다면 비가상 함수로 선언하고, 이후에는 가상 함수로 만들라는 잘못된 의견이 있어도 흔들리면 안됩니다. (고집을 피우라는 것은 아닙니다) 대입과 복사 생성은 모든 클래스에 대해 처리해 둬야 합니다. 지금 사용하지 않는다는 것이 나주엥도 사용하지 않는다는 것을 의미하지는 않습니다. 당장 처리를 하기 까다로운 상황이라면 이들을 private로 선언하여 향후 발생할 수 있는 오동작을 방지해야 합니다. 또한..
2023.01.29 -
C++ 헤더 내 구현 장/단점
단점 compile 시간 및 link 시간의 증가 interface와 구현의 분리 불가 circular dependency 등 여러 dependency 문제 발생 가능 executable size의 증가 (code section의 증가) 장점 사용이 쉬움 다른 binary file의 link 없이 사용 가능 include 하나로 사용 가능 template의 경우 코드 생성을 위해 header에 존재해야 함
2023.01.27 -
C++ string split
In the C++, we can split a string with a delimiter as follows. #include #include #include #include std::vector splitString(const std::string &input, char delimiter) { std::vector res; std::stringstream ss(input); std::string temp; while (getline(ss, temp, delimiter)) { res.push_back(temp); } return res; } and we can use the helper function above like this. auto listOfInputSrc = splitString(reque..
2023.01.27