반응형

C++ 73

C++ unique_ptr을 응용하여 자동으로 핸들을 닫는 클래스 만들기

C++을 사용하여 프로그램을 하다보면 핸들을 많이 다루게 됩니다. 특히 I/O 관련 작업을 할 때나 윈도우 API를 사용할 때 파일을 비롯한 각종 핸들(HANDLE)을 사용하게 됩니다. 이 때 다 사용한 핸들을 닫아주지 않으면 핸들 관련 누수(Leak)가 생기게 됩니다. 이럴 경우 unique_ptr을 이용하여 구간에서만 핸들을 사용하고 다 사용한 후에는 자동으로 핸들을 자동으로 닫게하면 위에서 말한 문제가 일어날 가능성이 적어지게 됩니다. 아래 예제 코드를 살펴보겠습니다. #include #include using namespace std; struct FileCloser { void operator()(FILE* file) const { if (file) { fclose(file); std::cout

C++ 프로그래밍 2024.04.15

C++ 코루틴(coroutine) 활용 강좌: #4 : co_yield

이번 강좌는 co_yield 이용하여 값을 생산하면서 제어권을 다른 쪽으로 넘기는 예제를 살펴보도록 하겠습니다. 코루틴 상태 관련 객체로 cotask_enumarator을 정의하여 사용합니다. 구체적으로 값을 생산하는 함수A 예를 살펴보도록 하겠습니다. 이 예제는 Unity 등 C#에서 많이 쓰는 IEnumerator를 리턴하는 함수와 같은 cotask_func_enum 함수를 정의하고 있습니다. 이 예제는 C#에서 많이 쓰는 코루틴 기법을 C++에서 사용하는 법을 보여주고 있습니다. 예제 코드는 아래와 같습니다. #include #include #include #include #include #include using namespace std; template struct cotask_enumarato..

강좌 2022.05.24

C++ 코루틴(coroutine) 활용 강좌: #3 : co_return

이번 강좌는 co_await를 이용하여 함수 중간에 제어권을 다른 쪽으로 넘기다가 코루틴 함수의 끝에 co_return으로 값을 리턴하는 예제를 살펴보도록 하겠습니다. 예제는 실행 중간에 실행권을 멈추고 제어권을 다른 쪽으로 넘기면서 실행되다가 코루팀 함수의 끝에 값을 co_return으로 리턴하고 종료하는 코루틴 함수 A와 B를 보여주고 있습니다. C++ 코루틴(coroutine) 활용 강좌: #2 : co_await의 예제와 내용이 비슷한데 co_return으로 값을 리턴하고 코루틴 함수가 종료된다는 것만 틀립니다. 예제 코드는 아래와 같습니다. #include #include #include #include using namespace std; template struct cotask_return ..

강좌 2022.05.23

C++ 코루틴(coroutine) 활용 강좌: #2 : co_await

이번 강좌는 c++ coroutine의 기본적인 사용법과 co_await를 이용하여 함수 중간에 제어권을 다른 쪽으로 넘기는 것을 살펴보도록 하겠습니다. 구체적으로 실행 중간에 실행권을 멈추고 제어권을 다른 쪽으로 넘기면서 실행되는 함수 A와 B의 예를 살펴보도록 하겠습니다. 예제는 Win32의 Fiber를 사용하는 것과 비슷하게 느껴질 것입니다. 예제 코드는 아래와 같습니다. #include #include #include #include using namespace std; struct cotask_noreturn { struct promise_type; using handle_type = std::coroutine_handle; struct promise_type { std::exception_pt..

강좌 2022.05.20

C++ 코루틴(coroutine) 활용 강좌: #1 시작하며 그리고 기본 개념

코루틴이라는 것이 개념적으로는 쉬운 내용이고 C#과 같은 다른 언어에서는 언어의 기본 구현에 포함되어 간편하게 사용할 수 있습니다. 하지만 C++은 늦게 C++ 20 표준에 포함되었고 구현이 조금은 투박하게 느껴지는 관계로 사용하는게 쉽지는 않습니다. 이런 이유로 코루틴의 활용보다는 코루틴 사용을 위한 기반 내용에 초점이 맞추어져 있는 기존 글들과는 달리 활용에 맞추어 강좌를 만들었습니다. 이 강좌 시리즈에서는 표준에 맞게 C++로 구현한 코루틴 관련 상태 객체 소스를 바탕으로 실제로 코루틴을 사용하는 활용 예제를 살펴보도록 하겠습니다. C++ 표준에서 코루틴을 사용하기 위하여 직접 구현해야 하는 것 중 하나가 코루틴 관련 상태 객체인데 이 부분은 예제 소스로 제공하도록 하겠습니다. 실제로 자신의 프로젝..

강좌 2022.05.19

C++ REST API 사용 강좌 : #2 HTTP POST (boost beast 활용)

이번에는 C++ boost beast를 활용하여 JSON을 인자로 REST API을 호출하여 데이터를 받는 예제를 살펴보도록 하겠습니다. 이 강좌는 C++ REST API 사용 강좌 : #1 HTTP GET (boost beast 활용)에서 이러지는 강좌로 설명 소스가 비슷한 관계로 해당 글에서 설명한 내용(UTF-8, 비동기 처리 등)은 이 글에 없는 관계로 해당 글도 꼭 참고 부탁드립니다. 이번에 살펴볼 소스는 아래와 같습니다. #include #include #include #include #include #include using namespace std; int main(int argc, char* argv[]) { boost::asio::io_context ioc; boost::asio::ip..

강좌 2022.05.12

C++ REST API 사용 강좌 : #1 HTTP GET (boost beast 활용)

근래에는 TCP/IP로 바로 통신하는 프로그램보다는 REST API를 이용하여 통신하는 프로그램이 대세인 듯 보입니다. 여기서는 C++로 REST API를 사용하는 방법을 알아보도록 하겠습니다. 강좌는 boost를 사용하였으며 boost에서 HTTP 통신 관련 상위 라이브러리인 boost beast를 사용합니다. REST API의 기본이 되는 GET 메소드를 이용하여 데이터를 가져오는 방법을 살펴보겠습니다. GET 메소드를 이용하여 데이터를 가져오는 소스는 아래와 같습니다. 소스를 보면서 계속 설명하겠습니다. #include #include #include #include #include #include using namespace std; int main(int argc, char* argv[]) { ..

강좌 2022.05.11

C++ boost json array 생성 및 파싱 예제

boost json라이브러리를 사용할 때 json array를 생성하거나 파싱하는 예제입니다. 사용법은 예제가 간단하게 되어 있는 관계로 예제를 이해하시면 됩니다. #include #include using namespace std; using namespace boost; int main(int argc, char* argv[]) { json::value jv1 = { { "Hello", "World1" } }; json::value jv2 = { { "Hello", "World2" } }; json::object jo1; jo1["test1"] = jv1; jo1["test2"] = jv2; std::string str1 = json::serialize(jo1); cout

C++ system_clock을 이용하여 64bit tick값 저장 및 로드 예제

게임의 아이템 등 여러 곳에서 데이터의 시간 값을 저장하고 로드합니다. 여기서는 system_clock을 이용하여 시간 값을 64bit 변수로 저장하고 로드하는 예제를 살펴보도록 하겠습니다. 참고로 변수 값은 보통 실무 프로젝트에서는 tick이라고 불리웁니다. 예제에서는 실제로 값을 저장하지는 않지만 long long 값인 tick 값을 64bit 변수 값으로 DB 등에 저장하고 로드하면 됩니다. #include #include using namespace std; using namespace chrono; int main(int argc, char* argv[]) { system_clock::time_point now = system_clock::now(); long long tick = now.tim..

C++ 프로그래밍 2022.03.28

C++ 람다를 활용하여 함수 내 중복 코드 줄이기

람다는 정말로 활용하면 할수록 유용한 기능인 듯합니다. 막상 활용하기 시작하니 람다 없던 시기의 코드에 비하여 코드의 양도 줄어들고 코드도 이해하기가 더 쉬워지는 듯 합니다. 이 글에서는 람다를 활용하여 함수내 중복 코드를 제거하는 예를 살펴보겠습니다. 아래 코드는 제가 작성한 코드로 실제 프로젝트에서 흔희 볼 수 있는 반복적인 코드입니다. 코드 내용은 중요하지 않으니 형태만 참고하시면 됩니다. switch (nSBCode) { case SB_LINEUP: pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 1); if (chartUse_.test(IDX_CHART_SUB)) chartSub_->ScrollX(pScrollBar->GetScrollPos());..

C++ 프로그래밍 2022.03.23

C++ 람다 사용시 변수 캡처 주의점과 shared_ptr의 활용

C++의 람다는 근래에 많이 쓰이는 기술 중에 하나 입니다. 람다는 흔희 변수를 캡처하여 내부에서 많이 사용합니다. 이럴 때 생각해야 할 점이 변수를 참조로 캡처할 것인가 복사로 캡처할 것인가 하는 점입니다. 기본적으로 내부에서 캡처한 외부 변수의 값을 변경하고자 하거나 복사에 따른 오버헤드가 크다고 생각한다면 혹은 객체 내부에서 객체 함수 등을 참조해야 한다면 참조로 캡처를 사용하게 됩니다. 반대로 내부에서만 값을 변경 또는 사용하거나 복사에 따른 오버헤드가 크지 않으면 복사로 캡처하여 사용합니다. 람다는 참조로 캡처하여 사용할 때 주의점은 캡처한 변수가 람다를 다 사용할 때까지 메모리에 남아 있어야 한다는 것입니다. 간단한 아래와 같은 예를 하나 살펴보겠습니다. 참고로 이 예제는 실제로 일어날 수 있..

C++ 프로그래밍 2022.01.21

C++ string_view의 이해와 활용

string_view는 C++ 17에 추가된 클래스로 문자열에 대한 참조라고 볼 수 있습니다. 사용법은 string과 유사하며 장점은 string에 비하여 적은 메모리 사용량과 연산 성능에 대한 이점을 가지고 있습니다. 단점은 잘못된 사용시 임시 객체 사용에 따라 참조가 없어져 예상치 못한 에러가 발생할 가능성이 있으며 내부구조가 널로 종료하는 문자열을 참조하지 않는 관계로 널로 종료하는 문자열을 필요로하는 C API와 같은 함수에 사용할 수 없다는 점 등이 있습니다. 참고로 string_view는 가볍다는 장점을 바탕으로 몽고DB C++ 드라이버에서는 벌써 적절하게 사용하고 있습니다. 이 글에서는 string_view의 특성, 사용법, 장점 및 단점을 살펴보도록 하겠습니다. string_view 특성 ..

C++ 프로그래밍 2022.01.15

MS 비동기 에이전트 라이브러리 소개: #2 Hello World

비동기 에이전트 라이브러리(Asynchronous Agent Library)를 사용하여 Hello World를 출력하는 아래 예제를 살펴보겠습니다. #include #include #include #include #include using namespace concurrency; using namespace std; class agent_01_a : public agent { public: explicit agent_01_a(ISource& source, ITarget& target) : source_(source), target_(target) { } protected: void run() { send(target_, string("Hello")); string response = receive(sou..

MS 비동기 에이전트 라이브러리 소개: #1 개념

비동기 에이전트 라이브러리(Asynchronous Agent Library)는 아래와 같은 특성을 갖는 병렬처리 라이브러리입니다. MPI와 같이 메시지 기반으로 병렬 처리를 합니다. 참고: [MPP] Introduction To Message Passing Interface(MPI) 액터 기반(Actor-Based) 기반의 프로그래밍 모델을 제공합니다. 액터 기반의 프로그래밍 모델은 각각의 독립된 처리를 하는 액터들이 메세지를 주고 받으며 병렬처리를 하는 프로그래밍 방식입니다. 참고: Actor-based Concurrency 비동기 에이전트 라이브러리는 독립적인 일을 하는 에이전트 들이 존재하며 이들은 데이터 흐름에 기초한 비동기적 통신을 위한 연결을 가지고 있습니다. 위의 참고 자료를 보면 액터 기반..

반응형