본문 바로가기

[c++] std::async와 std::thread 사용하기 들어가기 이 글은 C++에서 비동기 전체를 다루지는 않는다. 이미 thread 작동 방식이나 사용에 대해서는 어느정도 알고 있다고 가정한다. std::thread와 std::async에 대한 간단한 사용법과 각 자원 해제시 주의점, 몇 가지 고려할 점을 정리했다. 작성자: ospace114@empal.com, http://ospace.tistory.com/ 맛보기 비동기 처리에 있어서 std::thread와 std::async을 사용하는 방법이 있다. std::thread와 std::async은 결과는 같지만 실제 동작과 인터페이스가 조금씩 다르다. std::thread는 스레드 기반(thread-based) 프로그래밍이고 std::async는 과제 기반(task-based) 프로그래밍이다. std::t.. 더보기
[c++] 람다식 사용하기 들어가기 가장 유용하지만 가능 신경써야할게 많은 람다식이다. C++14에서는 auto로 인해 더 사용이 용이해졌다. 그러나 사용할 때 주의해야할 점이 있다. 하나씩 살펴보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ 람다식 람다식의 기본형은 다음과 같다. ["capture 절"]("인자목록") "추가사양" "예외사양" -> "반환형식" { "몸체" } capture 절: 해당 범위에서 액세스 또는 복사할 변수를 지정한다. 만약 없다면 “[]”만 사용하면 된다. 또한 기본 모드를 지정할 수 있다. “[&]”을 사용해 해당 범위의 모든 변수를 참조할 수 있고 “[=]”를 사용해 모든 변수를 복사해서 값을 사용할 수 있다. 또는 개별로 지정하거나 기본 모드.. 더보기
[c++] 보편참조와 오버로딩 들어가기 보편참조는 왼쪽 참조와 오른쪽 참조를 모두 받는 참조이다. 이런 보편참조는 보통 템플릿 함수를 사용해서 구현한다. 단순히 모든 참조만 받는 용도로만 쓰면 유용하지만, 그렇지 않는 상황이 발생한다. 보편참조를 사용할 때 문제점을 알아보고 이를 해결하는 방법을 살펴보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ 보편참조 사용자 이름을 목록에 추가하는 아주 일반적인 함수가 있다. std::multiset names; void addName(const std::string& name) { names.emplace(name); } 함수 자체는 크게 문제가 없지만 비효율성이 있다. 다음 실행 예를 보자. std::string myName("Foo"); .. 더보기
[c++] std::move와 std::forward 사용하기 들어가기 c++11에서 std::move와 std::forward는 왜 사용하는지 이해하기 힘들었다. 어쩌면 오른쪽 참조를 많이 사용하지 않아서? 혹시 보편참조가 무서워서 사용하지 않아서인가? std::move와 std::forward을 왜 사용하는지 이해하고 어떻게 사용할지 알아보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ std::move std::move의 역활은 단순하다. 오른값으로 캐스팅하는 함수이다. 아래 처럼 일반적인 왼값도 오른값으로 캐스팅할 수 있다. void f(Box&& box) {} Box box; f(std::move(box)); // 오른값 참조 호출 std::move의 동작방식을 이해하면 좀더 쉽게 이해할 수 있다. C++.. 더보기
[c++] 특수 멤버함수 사용하기: 복사 생성자/배정 연산자, 이동 생성자/배정 연산자, =default, =delete 들어가기 컴파일러가 정의되어 있지 않다면 자동 생성하는 특수 멤버함수(special member function)가 있다. 기본 생성자, 소멸자, 복사 생성자, 복사 배정 연산자, 이동 생성자, 이동 배정 연산자 들이다. 이동 생성자(move constructor)와 이동 배정 연산자(move assignment operator)는 C++11에서 추가되었다. 이들 특수 멤버 함수 자동 생성과 구현시 서로 간에 어떤 영향이 있는지 살펴볼려고 한다. 작성자: ospace114@empal.com, http://ospace.tistory.com/ Box 클래스 먼저 간단한 Box 클래스를 만들어보자. 단순 값 한개를 관리하게 최대한 단순하게 정의했다. class Box { public: int getValue(.. 더보기
[c++] override, const_iterator, noexcept, constexpr 사용하기 들어가기 이번에는 C++11에서 override, const_iterator, noexcept, constexpr에 대해서 살펴보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ override 선언 C++11에서는 파생 클래스(derivered class)에서 기반 클래스(base class)의 가상 함수를 재정의(override)할 때에 함수에 override을 붙인다. 기존에는 잘못으로 인한 잠재적 오류 가능성이 있다. override을 사용해서 명시적으로 지정하여 조건에 맞지 않으면 에러가 발행하도록 한다. 실제 사용 예를 보자. class Base { public: virtual void mf1() const; virtual void mf2();.. 더보기
[c++] nullptr, using, enum class 사용하기 들어가기 이번에는 C++11에서 nullptr, using, enum class에 대해서 살펴보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ nullptr 사용 기존 NULL 또는 0 대신에 사용할 수 있는 nullptr가 있다. NULL도 내부적으로 0으로 정의되어 있는 경우가 대부분이다. 이는 0값과 혼동이 발생할 수 있기 때문에 nullptr을 사용을 권장하다. 이는 템플릿 사용할 때에 형식 연역시 유용하다. 기존 NULL은 int 형식으로 인지하면서 에러가 발생할 수 있다. template auto foo(FuncT& func, PtrT ptr) { return func(ptr); } int f(std::shared_ptr spb); foo(f.. 더보기
[c++] decltype, auto, 중괄호 초기화 사용하기 들어가기 C++11에 추가된 기능 중에 decltype과 auto가 있다. decltype은 대상의 형식이나 값 범주를 수정 없이 그대로 타입으로 생성하며, auto는 모든 종류의 데이터를 저장할 수 있는 타입이다. 하나씩 살펴보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ decltype 키워드 delctype은 객체에 선언된 원래 형식을 가감없이 그대로 나타낸다. 참조 정보까지 포함한다. #include struct Box { int value = 0; }; int main() { const int val = 0; std::cout 더보기

반응형