C++

    스마트 포인터 문제 - 순환 참조

    스마트 포인터 (Smart Pointer) 레퍼런스 카운팅 기반의 스마트 포인터 구현 Reference Counting #pragma once /*--------------------- *RefCountable ---------------------*/ class RefCountable { public: RefCountable() : m_refCount(1) {} virtual ~RefCountable() {} int32 GetRefCount() const { return m_refCount; } int32 AddRef() { return ++m_refCount; } int32 ReleaseRef() { int32 refCount = --m_refCount; if (refCount == 0) { dele..

    [C++20] std::span

    [C++20] std::span

    std::span C++ 20부터 추가된 연속된 메모리 공간을 추상화한 컨테이너다. 이러한 연속적인 공간을 갖는 컨테이너로는 vector, array, string 등이 있다. std::vector vecNums{ 1,2,3 }; std::array arrayNums{ 1,2,3,4 }; int cNums[6] = { 1,2,3,4,5,6 }; // c style 이와 같은 array들이 있다고할 때 하나씩 Print하기 위해서는 각 인터페이스에 맞는 함수를 만들어야한다. // vector 출력 void printVec(std::vector const& nums) { for (int num : nums) { cout

    [C++] 문자열 정리

    문자열 총정리 C- style의 char와 C++ style의 string이 있다. 하나씩 확인해보자. C - style char Array 사용 char a[6] = { 'a', 'b', '\n', 'c', 'd', 'e' }; cout

    [C++17] string_view

    string_view (C++17) C++17에서 string_view라는 기능이 추가되었다. void printString(const std::string& s) { std::cout

    [Async] std::packaged_task

    [Async] std::packaged_task

    std::packaged_task callable object를 wrap하는 템플릿 클래스이다. 즉, 람다함수나 기존의 함수 혹은 callable object를 비동기적으로 부를 수 있게 해주는 wrapper라고 생각하면 된다. 예를 들어, 비동기 함수 처리에는 std::async를 사용하거나 future,promise 쌍으로 다른 thread에 할당시키는 방법이 있었다. 그런데 packaged_task를 사용하면 비동기적으로 호출할 수 있는 오브젝트를 만들었기 때문에 std::async 보다는 우리가 원하는 컨트롤 할 수 있을 뿐 아니라 쉽게 코드를 만들 수 있다. Example Code #include #include #include #include int add1(int n) { return n +..

    [Async] std::async

    [Async] std::async

    std::async std:::async는 C++에서 비동기호출을 매우 쉽게 만들어준다. 이전에 promise와 future를 통한 커뮤니케이션 채널을 통해 비동기 함수를 구현할 수 있었다. 하지만 그 인터페이스를 보면 코드를 만들어가는 과정이 직관적이지 않다. 그래서 이러한 관계를 추상화시켜서 비동기 함수 호출을 더 쉽게 직관적으로 만들 수 있다. 간단한 코드부터 보자. Example Code : future, promise 컨셉 #include #include #include #include #include void add1(std::promise prms, int n) { prms.set_value(n+1); } int main() { int num = 42; std::promise prms; st..

    [Async] shared_future

    [Async] shared_future

    shared_future future와 promise는 1:1 매칭이 되어야하기 때문에 복사가 불가능하다. 하지만 promise를 통해 하나의 value가 set이 되면 이를 여러 곳에서 읽어야 하는 경우가 있을 수 있다. 여러 future에서 value를 읽어야하는 경우 Copy가 가능한 것이 shared_future이다. Example Code : shared_future 사용 #include #include #include #include #include void fn(std::shared_future fut) { std::cout

    [Async] Future, Promise

    [Async] Future, Promise

    Future, Promise future와 promise는 커뮤니케이션 채널을 만드는 하나의 쌍이다. 이 채널을 통해 전달할 수 있는 신호는 Data, Exception, Signal 그리고 각 promise와 future는 다른 thread에 있어도 되고 같은 thread에서 커뮤니케이션을 해도 된다. 간단하게 코드부터 확인해보자. Single Thread 예제 Example Code #include #include #include int main() { // 데이터를 넣을 수 있는 promise 생성 std::promise prms; // promise와 한 쌍이될 수 있는 future를 get_future함수를 통해 생성 std::future fut = prms.get_future(); // set..