이전 포스트에서 이야기한것처럼 std::async 는 스레드를 생성하지 않을 수도 있다. https://pppgod.tistory.com/56 불러오는 중입니다... 시동 방침을 통해 비동기로 수행되도록 할 수 있다. 시동 방침이 무엇인지 알아보자. std::launch::async 이 조건문을 사용하면 항상 스레드를 생성하게 된다. std::launch::deferred 해당 조건을 사용하면 get 이나 wait 을 호출할 때까지 함수가 실행되지 않는다. 위의 두가지 시동 방침을 살펴보았는데, 기본 시동 방침은 과연 무엇일까? 정답은 두가지 조건을 모두 사용한다. 다시 말하면 함수는 비동기적으로 실행될 수도 동기적으로 실행될 수도 있다. 그런데 위와 같은 특성 때문에 문제가 발생할 수 있다. 다음을 살..
비동기적으로 함수를 실행하는 방법은 std::thread 객체를 생성하는 방법과 std::async 객체를 생성하는 방법이다. std::thread 객체를 생성하는 방법이 스레드 기반 프로그래밍을 의미하고, std::async 객체를 이용하는 방법이 과제 기반 프로그래밍을 의미한다. 코드를 살펴보면 다음과 같은 차이가 존재한다. int doAsyncWork(); // 스레드 기반 std::thread t(doAsyncWork); // 과제 기반 auto fut = std::async(doAsyncWork); // future 객체가 생성됨 과제 기반 프로그래밍에서 future 객체가 생성된다는 것에 집중해야 한다. doAsyncWork 함수가 종료되면 반환값이 존재하는 것을 살펴볼 수 있는데 스레드를 사..
std::bind 는 C++98 부터 이어져 내려온 라이브러리의 일부였다. 그러나 C++14 에 들어서며 std::bind 는 필요성이 사라졌다. 그 이유를 살펴보도록 하자. 알람 함수를 만들어보자. using Time = std::chrono::steady_clock::time_point; enum class Sound { Beep, Siren, Whistle }; using Duration = std::chrono::steady_clock::duration; void setAlarm(Time t, Sound s, Duration d); 위 함수를 이용해서 한 시간 후부터 30초간 소리를 내는 알람 함수를 람다를 이용해서 만들면 다음과 같이 만들 수 있다. auto setSoundL = [](Sound..
람다 함수와 함께 auto 를 사용하는 것은 매우 고무적인 일이다. 다음과 같이 말이다. auto f = [](auto x) { return normalize(x); }; 이 람다 함수는 컴파일러에 의해 다음과 같은 클로저 클래스가 생성된다. class 컴파일러가_생성한_클래스 { public: template auto operator()(T x) const { return normalize(x); } ... }; 이제 문제가 생기는 것은 x 를 normalize 에 완벽 전달을 하고 싶어지면 어떻게 해야할까? auto f = [](auto&& x) { return normalize(std::forward(x)); }; ???에 적어야할 타입은 무엇일까? 우리는 항목3에서 배운 decltype 을 사용하..
이동 전용 객체들을 클로저 안으로 이동시키야 하는 경우를 알아보도록 하자. C++14 부터 새로운 갈무리 메커니즘을 도입하였다. 초기화 갈무리라는 것으로 다음과 같은 것을 할 수 있다. class Widget { public: ... bool isValidated() const; bool isProcessed() const; bool isArchived() const; private: ... }; auto pw = std::make_unique(); ... auto func = [pw = std::move(pw)] { return pw->isValidated() && pw->isArchived(); }; 마지막 줄에 캡쳐절이 초기화 갈무리라는 것이다. 재미있게도 좌변과 우변의 범위가 다른데, 좌변은 클로..
람다식의 관련된 문제로 여기서 말하는 갈무리는 캡쳐절을 주의하라는 의미이다. 아래 링크를 참고하자. C++의 람다 식 C++의 람다 식Lambda Expressions in C++ 이 문서의 내용 --> C + + 11 이상에서 람다 식 (종종 람다)은 호출 되거나 함수에 인수로 전달 되는 위치에서 무명 함수 개체 ( 클로저)를 정의 하는 편리한 방법입니다.In C++11 and later, a lambda expression—often called a lambda—is a convenient way of defining an anonymous function objec docs.microsoft.com 기본 갈무리 모드는 두가지로 나눌 수 있다. 하나는 참조에 의한 갈무리 모드와 값에 의한 갈무리 모드..
완벽 전달(perfect forwarding)은 한 함수가 자신의 인수들을 다른 함수에 완벽히 전달하는 것을 의미한다. 전달할 때 객체 뿐만 아니라 왼값 또는 오른값 여부와 const 와 volatile 과 같은 형식까지도 보존하여 전달해야한다. 완벽 전달을 수행하는 함수는 다음과 같은 형태를 가진다. template void fwd(T&& param) { f(std::forward(param)); } template void fwd(Ts&&... params) { f(std::forward(params)...); } 위와 같은 형식을 가지는 대표적인 함수는 STL에서 emplace 함수들과 std::make_shared, std::make_unique 등이 위와 같은 형태를 사용한다. 이번 장에서 이야..
C++11 에서 이동 연산이 추가된 이유는 아무래도 성능 개선 때문일 것이다. 이 때문에 우리는 항상 이동 연산을 사용하면 빠를것이다라고 기대하는데 현실은 아닐 수 있다. 이동 연산을 지원하지 않는 클래스일수도 있고, 성능이 생각보다 좋아지지 않는것일수도 있다. std::vector 와 std::array 를 비교하며 살펴보도록 하자. 먼저 std::vector 를 살펴보자. std::vector 의 내부에서는 힙 메모리를 이용하여 자료들을 저장하고 이 힙 메모리를 가르키는 포인터를 이용해서 동작한다. 덕분에 std::vector 를 이동시키게 되면, 포인터를 전달하면 되기 때문에 상수 시간에 이동이 끝난다. 반면에 std::array 는 내장 배열에 인터페이스를 씌워놓은 형태이다. 이동을 하게 되면 내..
- Total
- Today
- Yesterday
- 람다
- C
- CPP
- std::move
- C++
- const
- 다이소
- Future
- C++14
- async
- 발아시기
- Overloading
- std::forward
- Override
- forward
- 보편 참조
- Modern
- Forwarding
- auto
- thread
- detach
- Effective
- C++11
- Perfect
- Effective Modern C++
- 포인터
- Unreal
- Join
- MOVE
- 보편참조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |