반응형

분류 전체보기 221

boost locale을 이용한 C++에서의 Multi Byte와 UTF8간의 문자열 변환

영문만 있는 경우는 문자열은 C/C++에서 UTF-8로 별도의 변환을 필요로 하지 않습니다. 하지만 한글과 같이 멀티 바이트를 사용하는 경우는 별도로 UTF-8로 인코딩 및 디코딩을 해주어야 합니다. 이런 경우 사용할 수 있는 라이브러리가 boost local입니다. 간단한 Multi Byte와 UTF8간의 문자열 변환 예제는 아래와 같습니다. #include #include #include using namespace std; int main(int argc, char* argv[]) { string str = "{\"name\": {\"first\":\"그레이스\", \"last\":\"Hopper\"}}"; cout

동적 라이브러리(DLL)를 사용할 것인가? 아니면 정적 라이브러리(LIB)를 사용할 것인가?

일정 규모 이상의 프로그램을 만들다보면 공통적으로 참조하는 공통 라이브러리를 만들고 여러 프로그램에서 참조하게 하는 경우가 종종 있습니다. 공통 라이브러리는 프로그램에 내용이 포함되는 정적 라이브러리와 DLL, SO등의 별도 확장자로 필요에 따라 로딩되어 참조되는 동적 라이브러리가 있습니다. C++이나 기타 언어의 서적을 보게 되면 실행 파일이 참조하는 라이브러리로 보통은 동적 라이브러리를 많이 추천합니다. 동적 라이브러리의 장점은 아래와 같습니다. 첫째로 여러 프로그램이 참조하더라도 라이브러리 사용 메모리는 하나의 프로그램의 사용에 필요한 만큼만 필요합니다. 덕분에 메모리는 여러개의 프로그램에서 참조하더라도 (사용 프로그램 수 N개 - 1) * 사용 메모리 크기 만큼 절약하게 됩니다. 둘째로 라이브러리..

C++ 프로그래밍 2021.11.18

평면과 두 점 사이에 만나 점 구하기

평면의 방정식은 아래와 같습니다. ax + by + cz + d = 0 면의 방정식과 두 점을 아는 상태에서 평면과 만나는 두 점 사이의 점을 구하여 보겠습니다. 비율 r을 P – P0 / P1 – P0으로 정의하겠습니다. 비율 r을 구하기 위하여 분모 및 분자에 평면에 수직한 법선 벡터 n을 내적하면 비율 r은 아래와 같습니다. 참고로 벡터 n은 평면을 방정식을 응용하면 (a, b, c)가 됩니다. r = P·벡터 n – P0 ·벡터 n / P1 ·벡터 n – P0 ·벡터 n 여기서 P는 평면과 교차함으로 평면내에 포함되어 있어 P·벡터 n은 평면의 방정식에 의하여 –d가 됩니다. r과 관련된 수식에서 P의 값 만을 알 수 없었으므로 P·벡터 n을 –d값으로 치환하여 r을 구합니다. P는 P0 + r ..

세 점을 포함하는 평면의 방정식 구하기

평면의 방정식은 아래와 같습니다. ax + by + cz + d = 0 평면이 세 점 P0, P1, P2를 그림과 같이 포함한다고 하겠습니다. 해당 세 점을 바탕으로 벡터 V1 = P1 – P0과 벡터 V2 = P2 – P0을 정의할 수 있습니다. 그리고 벡터 V1과 벡터 V2의 외적를 구한 후 정규화하여 벡터 V를 구할 수 있습니다. 이 때 벡터 V의 x, y, z은 평면의 방정식의 a, b, c가 됩니다. 구한 벡터 V에 P0을 내적하면 평면의 방정식에 의하여 0이 되어야 함으로 이를 바탕으로 아래와 같이 d를 구할 수 있습니다. 벡터 V·P0 + d = 0 d = - (벡터V·P0) 마지막으로 위에서 구한 a, b, c, d를 대입하여 평면을 방정식을 구하면 됩니다.

C++ boost 메모리풀 강좌 #5: boost 메모리풀 할당자를 적용하여 STL 컬렉션의 성능 향상시키기

STL 컬렉션은 템플릿 지정자를 이용하여 메모리 할당자를 설정할 수 있습니다. 참고로 메모리 할당자란 컬렉션에 요소에 대해서 메모리 new / delete하는 객체를 말합니다. STL 컬렉션에 메모리 할당자를 메모리풀을 사용하도록 하여 성능을 향상 시킬 수 있습니다. boost에는 이 STL 컬렉션 관련 메모리 풀 지원 할당자가 pool_allocator와 fast_pool_allocator이 있습니다. 두 할당자 모두 어느 STL 컬렉션에나 사용할 수 있습니다. 특징적으로 pool_allocator는 vector처럼 연속된 메모리 할당 및 해제가 일어나는 STL 컬렉션에서 성능이 좋습니다. fast_pool_allocator는 list처럼 단일 메모리 할당 및 해제가 일어나는 STL 컬렉션에서 성능이 ..

강좌 2021.11.15

C++ boost 메모리풀 강좌 #4: object_pool 클래스를 이용하여 new 재정의 없이 일반 클래스에 메모리풀 적용하기

object_pool은 pool의 클래스 할당 및 해제 버전으로 보면 이해하기 쉽습니다. pool과 사용법이 유사한데 틀린점은 construct와 destory 함수를 이용하여 할당 및 해제를 한다는 점입니다. 또한 construct 함수를 호출할 때 생성 인자를 넣어서 생성할 수도 있습니다. 단, 아쉽게도 생성인자는 3개까지 지원합니다. new 재정의로 메모리 풀을 적용하지 않은 클래스에 대하여 생성시점에서 메모리풀을 사용하기에 좋습니다. 간단한 예를 살펴보도록 하겠습니다. #include #include using namespace std; class test_mpa2 { private: char test_[256]; public: test_mpa2(const char* str) { strcpy_s(..

강좌 2021.11.14

C++ boost 메모리풀 강좌 #3: singleton_pool 클래스를 이용하여 일반 클래스에 메모리풀 적용하기

singleton_pool 클래스도 기본적으로 이전에 설명한 pool과 비슷합니다. 이 클래스는 템플릿 주요 인자로 할당 크기를 구분하는 태그 인자와 할당 크기를 받습니다. 태크 인자와 할당 크기라는 인자 특성 때문에 일반 클래스에 operator new / delete를 재정하여 적용하기에 쉽습니다. 이 외에 singleton_pool은 기본적으로 멀티쓰레드에서 안전합니다. 싱글쓰레드에서 사용할 때는 성능을 올리기 위하여 mutex 인자 부분에 boost::details::pool::null_mutex을 넣어주면 좋습니다. 간단한 사용법 예를 살펴보겠습니다. #include #include using namespace std; template class memory_pool_allo..

강좌 2021.11.13

C++ boost 메모리풀 강좌 #2: pool 클래스를 이용하여 버퍼에 메모리풀 적용하기

boost 메모리풀 관련 클래스 중 pool은 메모리풀을 활용하여 C 스타일로 메모리를 할당 및 해제할 때 사용할 수 있는 클래스입니다. 이런 특성을 가진 관계로 C++에서 C스타일로 메모리를 할당 및 해제하는 버퍼에 적용하기 좋습니다. 이 클래스를 버퍼에 활용하면 메모리풀이 적용되어 성능 향상에 좋습니다. 간단히 아래 예제를 통하여 살펴보겠습니다. #include #include using namespace std; int main(int argc, char* argv[]) { boost::pool pool(sizeof(char) * 32); char* test = (char*)pool.malloc(); strcpy_s(test, sizeof(char) * 32, "test test test test"..

강좌 2021.11.12

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

병렬처리 개념 강좌: #6 설계 관련 팁

병렬 처리를 설계할 때 생각해 보면 좋은 것들은 아래와 같습니다. 병렬적으로 처리될 수 있도록 프로그램을 설계합니다. 프로그램에 따라서 단일 처리를 병렬 처리를 하기 위해서는 단순히 API를 사용하는 것 이상으로 프로그램 디자인 형태가 병렬 처리에 적합해야 하고 때때로 병렬처리를 위하여 수정해야할 수도 있습니다. 처음 디자인시 병렬 처리에 적합하도록 설계하면 좋습니다. 쓰레드를 고려하지 않고 단일 쓰레드 환경에서 작업 태스크 중심으로 설계를 합니다. 병렬처리는 앞에 설명한 대로 크게 2가지의 처리 형태를 가집니다. 멀티 쓰레드 사용 형태 보다는 이 CPU 관련 작업의 성능 향상을 할 수 있는 2가지 형태에 적합하도록 설계하는 것이 좋습니다. 로직의 디버깅을 위하여 병렬처리 뿐만 아니 단일처리에서도 동작하..

강좌 2021.11.09

병렬처리 개념 강좌: #5 설계 관련 3가지 생각 포인트

병렬처리 설계를 할 때 살펴보아야 할 3가지 포인트가 있습니다. 1. 확장성(Scaling) 코어 개수의 변화에 따라 성능이 더욱 좋아지도록 설계를 하여야 합니다. 데이터 병렬처리에서 100개의 데이터를 처리한다고 하였을 때 코어가 2개일 때는 각각 50개씩, 코어가 4개일 때는 각각 25개씩 처리할 수 있게 설계하는 것 같은 것이 좋은 예일 것입니다. 2. 적절성(Correctness) 병렬 처리를 통한 성능 향상에 최적화되도록 설계를 하여야 합니다. 병렬처리 프로그래밍은 멀티 쓰레드가 동시에 한 자원에 접근하였을 때 발생하는 동기화 문제가 발생할 수 있습니다. 또한 데드락 문제도 발생할 수 있습니다. 이는 멀티 쓰레드의 개별 쓰레드처럼 병렬 처리의 각각의 쓰레드도 처리를 위하여 자원을 사용하기 때문입..

강좌 2021.11.08

병렬처리 개념 강좌: #4 2가지 종류의 병렬처리

병렬처리는 사용 개념적으로 보았을 때 크게 데이터 처리 기반 병렬처리와 태스크 처리 기반 병렬처리로 나누어 질 수 있습니다. 데이터 처리 기반 병렬 처리(Data Parallelism) 큰 데이터를 분할하여 여러 개의 프로세스가 처리하는 것을 말합니다. 간단히 4개 코어를 기반으로 100개의 데이터를 처리한다고 하였을 때 1~25, 26~50, 51~75, 76~100 이렇게 데이터를 나누어서 4개의 코어가 각각 처리하는 것을 예로 들 수 있습니다. 이렇게 처리하면 데이터를 처리하는 부분은 이론적으로 N배의 성능 향상을 가져올 수 있습니다. 태스크 처리 기반 병렬 처리(Task Parallelism) 여러 개의 작업을 각각의 프로세스에게 분배하여 다중 처리하는 것을 의미합니다. 3개의 코어가 3개의 함수..

강좌 2021.11.07
반응형