Modern C++
-
packaged_task를 이용한 스레드 풀 구현 2Modern C++/Task 기반 비동기 프로그래밍 2020. 8. 28. 22:58
이전 장에 std::async 와 동일한 작업을 수행하는 함수를 구현해 보았다. 이제는 스레드에서 호출되는 람다를 queue에 저장하는 코드를 구현해 보자 2. queue 에 task 푸시 #include #include #include #include //람다 저장용 task_queue std::queue task_queue; #include template std::future async(Func&& func, Args... args) { using Result = std::result_of_t; //task 객체가 현재 범위를 벋어나면 사용 할 수 없으므로 동적으로 할당 auto task = new std::packaged_task( std::bind(std::forward(func), std::f..
-
1. std::unique_ptrModern C++/Smart Pointer 2020. 7. 2. 18:39
C++ 메모리 관리 C++에서 생 포인터(raw pointer)를 관리하기는 쉽지 않다. 자바는 가비지 콜렉터가 이를 수행하지만 C++같은 경우 사용자가 직접 메모리를 관리해야 한다. 잘못된 메모리 관리는 메모리 릭이 발생하거나 더블 프리 문제로 프로그램이 예외를 던지고 프로그램이 종료하기도 한다. 여기서 생 포인터를 사용하기 어려운 이유를 살펴 보기로 하자. struct Data { uint8_t *data_; size_t length_; }; 여기서 data_는 하나의 객체를 가리키는 포인터인지 배열을 가리키는 포인터인지 코드 자체로는 구별할 수 없다. 생성자에는 uint8_t 형 배열 포인터와 해당 배열의 크기를 받는 생성자와 소멸자를 추가해보자. struct Data { Data(const uin..
-
4. 이동가능 객체(Movable Type)Modern C++/Move Semantics 2020. 6. 30. 01:15
클래스를 이동 가능하게 만들면 많은 장점들이 있고 이동 가능한 사용자 정의 타입은 표준 라이브러리 유틸과도 잘 동작한다. 이동 연산을 지원하는 클래스를 만드는 경우 코드의 성능, 안정성이나 구현 할 수 있는 방식이 증가한다. 이동 가능한 사용자 타입을 정의하게 되면 표준 라이브리를 사용하는 중에도 이동 연산에 대한 이점을 얻을 수 가 있다. C++11 이전에 컴파일러는 기본 생성자, 소멸자, 복사 생성자, 복사 할당 연산자를 자동으로 추가해 주었는데, C++11 이 후는 여기에 이동 생성자와 이동 할당 연산자가 추가되었다. 여기서는 유리수를 나타내는 Rational 클래스를 통해서 이동 연산이 추가되었을 때 어떤 장점이 있는지 살펴본다. #pragma once #include class Rational ..
-
1. 이동 의미론(Move Semantics)Modern C++/Move Semantics 2020. 6. 29. 12:38
1. 이동 의미론 C++11 이후 C++ 의 가장 중요한 변화 중 하나는 복사를 통한 자원의 낭비를 줄이기 위해 객체 자원의 소유권을 이전 할 수 있는 이동 의미론이 추가되었다는 점이다. class Foo { }; 위와 같이 Foo 클래스 정의 시 컴파일러는 자동으로 기본 생성자, 복사 생성자, 할당 연산자, 소멸자를 생성해 주는 데, C++11 이후에 는 여기에 이동 생성자, 이동 할당 연산자가 추가되었다. 또한 STL 라이브러리의 범용 유틸리티나, 컨테이너들에도 이동 생성자나, 이동 할당 연산자가 구현되어 복사로 인한 쓸데 없는 자원의 소비를 줄일 수 있게 되었다. 이동 생성자와 이동 할당 연산자는 아래와 같은 형태로 std::vector의 예를 통해 확인 할 수 있다. std::vector::vec..