C++/Effective Modern C++
-
[Effective Modern C++] Universal reference와 OverloadingC++/Effective Modern C++ 2022. 7. 28. 14:54
이전 글(R-value reference와 Universal reference)에서 Universal reference(보편참조)가 무엇인지 살펴보았습니다. R-value, L-value객체 모두에 묶일 수 있는 범용성 높은 참조였습니다. 그런데, 이런 범용성 때문에 문제가 발생할 수 있습니다. 보편참조를 받는 함수를 오버로딩 할 때에 발생하는 문제점을 살펴보도록 하겠습니다. 1. 예제 더보기 이름을 담은 문자열을 매개변수로 받고, 시간을 기록한 뒤 자료구조에 추가하는 함수를 가정해보도록 하겠습니다. 그 형태는 아래와 같이 구현할 수 있을 것 입니다. std::multiset names; void logAndAdd(const std::string& name) { auto now = std::chrono:..
-
[Effective Modern C++] std::move와 std::forward (2)C++/Effective Modern C++ 2022. 7. 25. 11:16
이전 글 (std::move와 std::forward)에서 std::move와 std::forward에 대하여 알아보았습니다. 이동 시맨틱에서 이동 및 전달을 보조해주는 함수들로, 이름과는 달리 상황에 따른 R-value 캐스팅을 수행합니다. 이전 글에서 각각의 함수의 수행 기능, 의의를 살펴보았다면 이번 글에서는 각각의 함수를 사용하는 상황에 대한 예시를 몇 가지 살펴보도록 하겠습니다. 1. R-value reference에는 std::move 더보기 특정 매개변수가 R-value 참조라면, 그 참조에 묶인 객체는 반드시 이동할 수 있습니다. class MyClass { MyClass(MyClass&& rhs); ... }; 위와 같이, 함수가 객체의 R-value성질을 활용할 수 있어야 하는 경우, ..
-
[Effective Modern C++] R-value reference와 Universal referenceC++/Effective Modern C++ 2022. 7. 13. 22:24
R-value reference는 표기할 때 &&로 표기합니다. 형식 T에 대한 R-value reference는 T&&이 되는 것 입니다. 그러나 T&&이 항상 R-value reference가 되지는 않습니다. 이번 글에서는 그러한 예외에 대하여 살펴보도록 하겠습니다. 1. Universal reference 더보기 void function_1(MyClass&& param); MyClass&& var_1 = MyClass(); auto&& var_2 = var_1; template void function_2(std::vector&& param); template void function_3(T&& param); 위 다섯가지 코드에서, 각각의 &&가 의미하는 것은 다음과 같습니다. function_1..
-
[Effective Modern C++] std::move와 std::forwardC++/Effective Modern C++ 2022. 6. 30. 14:02
C++11에 제안된 이동 시맨틱(Move semantics)은 이동 생성자와 이동 배정 연산자를 사용합니다. 위 함수들을 사용함으로써 복사 연산을 이동 연산으로 대체하는 것에 의의가 있으며, 이것은 함수의 비용이 줄어든다는 장점을 가지고 있습니다. 또한 복사 연산을 제한하는 객체 (std::unique_ptr과 같은)를 이동 연산으로 이동할 수 있다는 특징이 있습니다. 이번 글에서는 이동 시맨틱에 사용되는 함수들인 std::move와 std::forward에 대해 살펴볼 것 입니다. 1. 개요 더보기 std::move와 std::forward는 각각 이동, 전달이라는 의미를 가진 함수입니다. 하지만, 이들 함수가 실제로 이동과 전달을 수행하지는 않습니다. 이들 함수를 사용한 코드의 결과를 보면 이동과 전..
-
[Effective Modern C++] Pimpl idiomC++/Effective Modern C++ 2022. 6. 1. 16:17
Pimpl 관용구 (Pimpl idiom)은 빌드 최적화 및 클라이언트 의존성 해소를 위한 디자인 패턴 입니다. 이번 글에서는 Pimpl에 대한 기본적인 구현 방식을 살펴보도록 하겠습니다. 1. Pimpl 더보기 Pimpl의 기본적인 구현 방식은 자료 멤버들을 특정 객체로 대체하고, 그 특정 객체를 포인터를 통해 간접적으로 접근하는 것 입니다. 예제를 살펴보도록 하겠습니다. class MyClass { public: MyClass(); ... private: std::string name; std::vector data; Object obj_1, obj_2; // Custom class }; 위와 같이 정의된 클래스가 있을 경우, 클라이언트는 , , object.h를 포함해야 합니다. 그리고 이것은 컴파..
-
[Effective Modern C++] Smart pointer : std::make_unique<>, std::make_shared<>C++/Effective Modern C++ 2022. 5. 25. 12:03
이전 글에서 스마트 포인터 중 std::unique_ptr, std::shared_ptr, std::weak_ptr에 대하여 살펴보았습니다. 스마트 포인터를 생성할 때에는 Raw pointer와 유사하게 new연산자를 사용하는 방법이 있고, 표준 라이브러리에 존재하는 std::make_unique, std::make_shared와 같은 함수를 사용하는 방법이 있습니다. 생성하는 방법은 두 가지지만, 특정 경우를 제외할 경우 new연산자 보다는 make함수를 사용하는 것이 권장됩니다. 이번 글에서는 두 종류의 make함수와 이것이 new와 비교하여 가지는 장점이 무엇인지 살펴보도록 하겠습니다. 1. 코드 중복 (Duplicate) 더보기 make함수들의 장점으로 보일 수 있는 가장 간단한 예시는 아래 예제..
-
[Effective Modern C++] Smart pointer : std::weak_ptr<>C++/Effective Modern C++ 2022. 5. 19. 18:07
스마트 포인터란 Raw pointer를 감싸는 래퍼(Wrapper) 클래스 입니다. 기존의 포인터가 가진 몇 가지 문제점들을 회피하면서, 포인터의 기능을 제공합니다. 이번 글에서는 스마트 포인터의 한 종류인 std::weak_ptr에 대하여 살펴보도록 하겠습니다. 1. std::weak_ptr 더보기 때때로, std::shared_ptr의 소유권 공유 기능을 가지되, 참조 횟수에는 영향을 미치지 않는 포인터가 필요할 수 있습니다. std::weak_ptr는 그러한 조건을 만족하는 포인터입니다. #include #include int main(){ auto sp = std::make_shared(); ... std::weak_ptr wp(sp); ... sp = nullptr; if(wp.expired()..
-
[Effective Modern C++] Smart pointer : std::shared_ptr<>C++/Effective Modern C++ 2022. 5. 16. 15:26
스마트 포인터란 Raw pointer를 감싸는 래퍼(Wrapper) 클래스 입니다. 기존의 포인터가 가진 몇 가지 문제점들을 회피하면서, 포인터의 기능을 제공합니다. 이번 글에서는 스마트 포인터의 한 종류인 std::shared_ptr에 대하여 살펴보도록 하겠습니다. 1. std::shared_ptr 더보기 std::shared_ptr는 공유되는 포인터 입니다. 한 객체를 포인팅하는 여러개의 std::shared_ptr는 객체에 대한 공동 소유권(Shared ownership)을 가지고 있습니다. 해당 객체는 객체를 소유하는 모든 std::shared_ptr가 객체를 가리키지 않게 되었을 때 소멸합니다. 위와 같은 공동 소유권을 구현하기 위해, std::shared_ptr는 내부적으로 자원의 참조 횟수(..