본문 바로가기

개발 Note/C++11,14 (modern C++)

(14)
String Compare (without space and special char) 일반적인 String compare 함수는 정확한 string을 비교해서 처리해야 하는 경우들이 많습니다. 그런데 간혹, 문자열이 엇비슷하면 같다고 처리하고 싶을 때도 있습니다. 예를 들면, 1. "나 ^^ 이뽀 :)~" 와 "나 ^^;;; 이뽀~~~???" 이런 문자열들을 같은 취급 하고 싶은 경우, 2. "이 름" 과 "이름" 과 같이 공백을 무시하고 싶은경우, 3. 마지막으로 "오늘 아침 날씨" 와 "오늘 오전 날씨" 와 같이 의미 갖는 단어들을 같은 것으로 취급하고 싶은 경우, 들 일것입니다. 3번은 단순 코드로는 해결하기 힘든 내용일 것입니다. '비슷한 문자열'이라는 개념을 정리하는 차원에서 써 놓은 항목입니다. 일단 순수한 코드차원에서 접근하자면, 1,2번의 경우에 대해서는 간단한 해결책이 있..
Singleton pattern and std::call_once Singleton pattern은 객체의 인스턴스가 process내에서 1개만 생성되도록 하는 것입니다. 이렇게 하기 위해서는 global 객체를 하나만 유지하고, 일반적으로 getInstance() 와 같은 class의 스테틱 메소드(static method)를 통해서 생성된 instance를 얻어가는 구조입니다. 주로 XXXX Manager 와 같은 management instance 류 들이 singleton으로 작성됩니다. 가장 simple한 구현체는 아래와 같은 형식입니다. class Singleton{ public: static Singleton* getInstance(); private: Singleton()=default;}; Singleton* Singleton::getInstance()..
rvalue reference 가 항상 유익하지 않다? 오른쪽 참조, R-Value Reference 란? 시기는 잘기억이 안나는데 어느시점에서 부턴가 C++ 쪽에서 rvalue , move sementic 이런 용어들이 자주 거론 되기 시작한 시기가 있었습니다. 꽤 많은 사람들이 여기에 대해서 유익한 개념이라고 언급했던 기억이 나네요. 블로그로 정리하기에는 좀 오래된 내용이지만, 한번 머리속을 정리해볼겸해서 작성하게 되었습니다. C++11 에서 도입된 새로운 특성중 의미이동(move semantic) 과 오른쪽 참조가 있습니다. 이것은 불필요한 복사를 줄이는 것을 목적으로 합니다. 여기에 대해서 알아보기 전에 이미 C++의 특성에 대해서 많이 알고 계신 분도 있겠지만, 그렇지 못한 분들도 있을것이라서 , 기본이 되는 내용이지만 생성자, 복사 생성자 등에 대..
C++ 11과 C++ 99 를 동시에 지원하기 위해서 feature를 구분할 때 유용한 팁 어떻게 compiler version 에 따라 API 지원 피쳐를 구분해서 제공할까 고민하다가 compiler 를 변경해가면서 직접 값을 정리해봤습니다.예를 들면,c++11 부터 지원하기 시작한 매우 유용한 feature들이 있습니다.1. final, override keyword 2. class 선언부에서 변수 초기화 하는것 이러다 보니, c++11로 개발하고 c++99 용 모듈에서도 사용할 수 있게 할 수 없을까?하는 아이디어( 요구사항)이 있었습니다. 사실 개발은 c++11로 하고 싶었거든요.아니면 code를 다시 다 걷어내거나 내부 로직에서 사용하고 있는 auto, lamda등을 다 걷어내야 하는 판국이라서 말이죠. 그래서 나온 아이디어가 이렇습니다. 1. 개발은 C++11로 한다.2. 다른 모듈..
gcc와 c++ feature GCC 에서 지원하는 C++11 피쳐들을 알아보자. gcc 4.9 에서는 c++11 피쳐가 지원된다는 것은 알고 있을겁니다. 그런데, gcc 4.6에서도 c++11 이 지원된다고 아셨다면, 아래 표를 참조해서 내가 쓸수 있는 피쳐와 그렇지 못한 피쳐를 확인해야 합니다. gcc 4.6 부터 c++11 피쳐들이 100% 지원되는 것이 아니기 때문이죠. 대표적으로 유용한 override keyword 는 4.7 부터 지원하고 있죠. Language FeatureProposalAvailable in GCC?SD-6 Feature TestRvalue referencesN2118GCC 4.3__cpp_rvalue_references >= 200610 Rvalue references for *thisN2439GCC ..
stl : map 과 array 성능비교. STL의 map,array의 성능에 차이는 없을까? key값이 string인 경우와 int인 경우의 차이는 얼마나 될까? 이것을 확인하기 위해서 아래와 같이 간단한 성능 테스트 프로그램을 작성해봤습니다. stringMapTC()는 strStr 에 들어있는 string들을 key로 하여 map의 요소에 접근하는 테스트 stringUnorderedMapTC()는 strStr 에 들어있는 string들을 key로 하여 unordered_map의 요소에 접근하는 테스트 intMapTC()는 int 값을 key로 하여 map의 요소에 접근하는 테스트 intArrayTC()는 stl::array로 요소에 접근하는 테스트 cArrayTC()는 stl container가 아닌 srcStr[] 에서 직접 35번 요소에 ..
effective modern c++: 멤버 함수 사용 제한을 delete 키워드로 하는 것이 낫다. 항목 11 : 우리가 class를 설계할때, 의도되지 않은 동작을 막기 위해 클라이언트에서 호출 할 수 없도록 막을 필요가 있습니다. 하지만, 특수 멤버 함수들인 C++이 필요에 따라 자동으로 작성된 멤버 함수들에서 이런 제한이 쉽지 않습니다. 특히 , 복사생성자, 대입 연산자등 몇몇에 대해서 private으로 정의하는 경우들이 있습니다. class A{ public: int get() const; int set(int d); private: A(const A& rhs); // unused ( or not defined) A& operator =(const A&); // unused (or not defined) }; 이에 관한 언급을 한 것이 11 항목입니다. C++11에서는 이를 위한 더 나은 방법을..
effective modern c++: typedef 보다는 using 항목 9 : typedef 보다는 별칭(using) 을 선호하라. STL 컨테이너들을 사용하는 것이 바람직하다. 이건 아마 c++을 사용하는 사람들은 동의 하리라 생각합니다. std::unique_ptr의 사용 역시 바람직하다는 점에 대해서도 동의 할것 같구요.(저도 동의합니다.) 하지만, "std::unique_ptr" 을 여러번 타이핑하는 것은 하고 싶지 않죠( 120% 공감) 이럴때 typedef 를 사용합니다. typedef std::unique_ptr UPtrMapSS; C++98 에서 사용하던 방식이죠. C++11에서는 별칭선언(alias declaration) 을 제공합니다. using UPtrMapSS = std::unique_ptr; 이 둘의 차이가 있을까요? 그전에 한가지!!! (사실 ..