반응형

C++ 73

C++ boost 메모리풀 강좌 #1: 메모리풀의 개념

메모리 풀은 미리 메모리를 할당하여 놓은 뒤 필요에 따라 할당 및 해제하여 사용하는 기법을 의미합니다. 메모리 풀은 아래와 같은 이점이 있습니다. 첫번째로 할당과 해제에 따른 성능의 향상이 있습니다. 이유는 메모리 할당과 해제 관련 함수는 실제적으로 OS로 부터 메모리를 가져오거나 할당과 해제 관련 메모리 관리처리를 하기 때문에 상대적으로 적은 양이지만 오버헤드가 있기 때문입니다. 두번째로 메모리 단편화가 줄어듭니다. 이유는 미리 상대적으로 큰 메모리를 할당한 뒤 사용하기 때문에 상대적으로 작은 메모리의 할당과 해제에 따른 메모리 단편화가 발생할 가능성이 줄어들기 때문입니다. 메모리 풀은 다음과 같은 단점이 있습니다. 첫번째로 메모리 사용 효율성이 떨어질 수 있습니다. 이유는 미리 상대적으로 큰 메모리를..

강좌 2021.11.11

[MongoDB] Mongo C/C++ Driver 관련 자료

Mongo C/C++ Driver란? MongoDB를 C/C++에서 사용하기 위한 일종의 SDK입니다. MongoDB C/C++ Driver 인스톨 및 컴파일 방법 Mongo C Driver는 기본적으로 다운받아서 컴파일해서 사용해야 합니다. 그리고 현재는 64bit 버전만을 지원합니다. 32bit는 ODBC 드라이버를 사용해야 할 거 같은데 이것은 검색해보시면 됩니다. Mongo DB C인스톨 및 컴파일 관련 포스팅은 아래와 같습니다. 참고자료: [MongoDB] 윈도우용 MongoDB C/C++ Driver 컴파일 및 인스톨 하기 BSON(Binary JSON) BSON은 JSON의 binary형태로 속도가 빠릅니다. Mongo C/C++ Driver는 기본적으로 JSON이 아닌 BSON을 사용합니다..

C++ chrono system_clock과 steady_clock의 이해 및 차이점

C++ chrono 라이브러리에는 기본적으로 system_clock과 steady_clock 두 개의 시간 측정 클래스가 존재합니다. 두 클래스의 기본적인 개념은 아래와 같습니다. system_clock은 전통적인 유닉스 타임으로 1970 1월 1일 목요일 0시 0분 0초 이후로 흘러간 시간을 나타냅니다. 그에 반하여 steady_clock은 마지막 부팅 이후로 흘러간 시간을 나타냅니다. 흔히 하는 이야기로 시계를 표현하기 위해서는 system_clock을, 초시계를 표현하기 위해서는 steady_clock을 사용해야 합니다. 그 이유는 system_clock과 같은 경우 OS 시간 동기화 등에 의하여 시간 측정 중에 시간 값이 변할 수 있기 때문인데 반하여 steady_clock은 그럴 가능성이 없기 ..

C++ 프로그래밍 2021.11.10

C/C++ __FUNCTION__, __FILE__의 유니코드 버전

유니코드를 출력하는 wcout이나 유니코드를 인자로 요구하는 함수와 같은 경우 __FUNCTION__, __FILE__이 제대로 출력되지 않습니다. 구글링 해보면 #define을 이용하여 새롭게 정의하여 출력하는 방식이 나와 있습니다. 처음에는 그렇게 사용했는데 비주얼스튜디오와 같은 경우(현재 2019 이용) 해당 __FUNCTION__, __FILE__의 유니코드 버전인 __FUNCTIONW__, __FILEW__을 corecrt.h에서 정의하고 있었습니다. 어느 버전부터 지원하는 지는 모르겠지만 최신 비주얼 스튜디오를 사용하신다면 그냥 __FUNCTION__, __FILE__을 유니코드로 사용하여야 한다면 __FUNCTIONW__, __FILEW__을 사용하시면 됩니다.

C++ 프로그래밍 2021.11.01

C++ invoke_result: return type 알아내기

invoke_result는 C++ 17부터 추가된 함수의 리턴 타입을 알아내는데 사용되는 함수 입니다. 기존에는 C++ 11에 추가된 result_of가 사용되었는데 C++ 20에서 삭제된 관계로 더 이상 result_of는 사용할 수 없습니다. 해당 함수는 템플릿을 프로그래밍을 할 때 사용할 수 있는 함수인 관계로 일반적인 프로그래밍에는 별로 사용되지 않을 듯 보입니다. 사용법은 invoke_result::type 입니다. 비주얼 스튜디오에서 제대로된 인자를 넣지 않을 경우 인텔리센스에서 멤버로 type이 나오지 않습니다. 아래 예제는 std::result_of, std::invoke_result(https://en.cppreference.com/w/cpp/types/result_of)을 응용하여 작성..

C++ 프로그래밍 2021.10.31

C++ static_assert

C++ 11에 추가된 것으로 기존 assert이 실행 시간에 오류를 검증하는데 비하여 static_assert은 컴파일 타임에 오류를 검증합니다. static_assert은 컴파일 타임에 오류를 검증할 수 없는 변수 값을 대입하는 경우 상수 값이 있어야 한다는 오류를 냅니다. 이런 특성을 가진 관계로 주로 템플릿 프로그래밍에서 타입 체크 등에서 사용됩니다. 비주얼 스튜디오에서는 코드 작성 중에 static_assert이 false일 경우 표시를 해주어서 편합니다. 사용 예는 아래와 같습니다. static_assert(1

C++ 프로그래밍 2021.10.30

error C3520: 'args': 이 컨텍스트에서 매개 변수 팩을 확장해야 합니다.

가변 인자를 받는 함수에서 가변 인자들을 가변 인자를 받는 다른 함수를 호출할 때 ...를 생략할 때 발생할 수 있습니다. 에러가 발생하는 아래 예제 코드를 살펴보겠습니다. template void thread_log_t(const std::wstring fmt, arguments ... args) { wstring str = format_string(L"thread[%d]: ", std::this_thread::get_id()); str += format_string(fmt, args ...); str += wend_line; wcout args ... 와 같이 가변 인자를 제대로 넘기면 에러가 해결됩니다. 가변 인자를 넘기기 위하여 ...가 추가되었다는 것에 주의바랍니다. 해당 에러가 수정된 코드 예..

C++ 프로그래밍 2021.10.28

C++ optional의 활용

C++ 17에 추가된 유용한 클래스 중에 optional이 있습니다. 해당 객체는 값을 리턴할 때 값이 없음을 표현하기에 유용합니다. 예제로 optional의 활용을 살펴보기로 하겠습니다. 참고로 optional을 사용하기 위해서는, 즉 아래 예제 코드를 컴파일 하기 위해서는 컴파일러에서 C++ 17 표준을 지원해야 하며 Visual Studio 컴파일러 같은 경우 C++ 17을 지원하기 위한 컴파일 옵션을 설정하여 주어야 합니다. #include #include #include using namespace std; class test_optional { private: vector data_{ 10, 20, 30 }; public: int getByIndex1(int index) { if (index ..

C++ 프로그래밍 2021.10.24

C++ boost json용 라이브러리(boost.json)

boost 1.75 이전 버전은 json을 사용하기 위하여 property_tree를 사용하였습니다. 1.75 버전부터 json을 전문적으로 지원하는 boost.json라이브러리가 생겼습니다. boost.json을 사용하는 Hello World입니다. #include #include #include using namespace boost; using namespace std; int main(int argc, char* argv[]) { json::value jv = { { "Hello", "World" } }; std::string str = json::serialize(jv); cout

C++ boost property_tree를 이용한 간단한 xml 파싱 예제

C/C++에서 json을 사용하려고 boost property_tree를 사용하다가 이 클래스가 xml파싱에도 거의 동일한 인터페이스로 사용할 수 있다는 것을 알게 되었습니다. 아래 예는 간단한 boost property_tree를 이용한 xml 파싱 예입니다. 참고로 소스 중 read_xml에서 iss(istringstream) 대신에 문자열을 넣으면 파일에서 읽게 됩니다. #include #include #include #include #include using namespace std; using namespace boost::property_tree; int main(int argc, char* argv[]) { string data = "" "" "Hello" "" "1" "2" "3" "" "..

C++ boost json(property_tree) Hello World

boost의 property_tree를 이용한 json Hello World입니다. boost 버전 1.75부터 json을 정식 지원하는 것 같은데 인터넷에 많이 있는대로 property_tree를 이용하여 json을 다룬다면 가장 기본이 되는 코드입니다. #define BOOST_BIND_GLOBAL_PLACEHOLDERS #include #include #include #include using namespace std; using boost::property_tree::ptree; int main(int argc, char* argv[]) { ptree root; root.add_child("Hello", ptree("World")); ostringstream oss; write_json(oss, ..

C++에서 stderr로 출력하기

요즘에도 stdout, stderr을 구분해서 출력하는지 모르겠지만 C/C++을 정석적으로 코딩한다면 에러 관련 내용은 stderr로 구분해서 출력하는 것이 좋다. stdout과 stderr로 구분하여 출력하면 Unix(Linux) Shell이나 Dos Shell에서 필터링해서 구분해 볼 수 있다. C 라면 아래와 같이 구분해서 출력할 수 있다. 물론 stdout을 사용한 부분은 그냥 printf을 사용해도 동일하다. fprintf(stdout, "test0\n"); fprintf(stderr, "test1\n"); C++ 이라면 아래와 같이 구분해서 출력할 수 있다. cout

C++ 프로그래밍 2021.10.11

C++ wstring용 가변인자 포맷(format) 스트링 만들기

C/C++로 로그(log) 같은 함수를 만들거나 변수들을 문자열로 만들고 싶을 때가 있다. 이런 때 쉽게 사용할 수 있는 함수이다. 여기서는 기본이 되는 함수의 소스를 소개할까 한다. 아래 함수는 wstring을 string으로 wchar_t을 char로 _vsnwprintf_s을 char용으로 수정하면 string용으로 수정할 수도 있다. _vsnwprintf_s은 윈도우용 API인 관계로 Linux 혹은 Unix에서는 해당 OS에 맞는 함수로 수정하면 Linux나 Unix에서 사용할 수 있다. 여기서는 소스가 복잡해지는 관계로 string용이나 윈도우 외의 OS용으로는 만들지 않았다. 또한 다른 가변 인자 함수에서의 사용을 위하여 주요 로직을 가지고 있는 함수의 인자는 va_list로 처리하였다. s..

C++ 프로그래밍 2021.10.08

[MongoDB] 윈도우용 MongoDB C/C++ Driver 컴파일 및 인스톨 하기

MongoDB를 C/C++에서 사용하기 위해서는 C용 MongoDB C Driver와 C++용 MongoDB C++ Driver가 있어야 한다. MongoDB C와 C++ Driver는 MongoDB를 사용하기 위한 일종의 라이브러리라고 볼 수 있다. 근데 이 드라이버가 윈도우에서는 MSI나 ZIP파일 형태로 제공되지 않아 소스를 받아서 컴파일 해야 한다. 또한 해당 드라이버는 현재 시점에서 64bit만 지원한다. 여기서는 Visual Studio 이용하여 드라이버를 컴파일 하는 방법을 살펴보기로 하겠다. 1. 윈도우용 CMake를 미리 다운받아 인스톨하여 놓는다. 참고로 인스톨 전에 기존 버전이 있으면 언인스톨해야 하며 64bit 버전을 인스톨한다. 이때 인스톨된 CMake는 PATH상에 존재하여 어디..

반응형