분류 전체보기
-
[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는 내부적으로 자원의 참조 횟수(..
-
[Effective Modern C++] Smart pointer : std::unique_ptr<>C++/Effective Modern C++ 2022. 5. 9. 17:10
스마트 포인터란 Raw pointer를 감싸는 래퍼(Wrapper) 클래스 입니다. 기존의 포인터가 가진 몇 가지 문제점들을 회피하면서, 포인터의 기능을 제공합니다. 이번 글에서는 스마트 포인터의 한 종류인 std::unique_ptr에 대하여 살펴보도록 하겠습니다. 1. std::unique_ptr 더보기 std::unique_ptr은 스마트 포인터를 사용할 때 가장 우선적으로 고려되는 포인터 입니다. 기본적으로 대부분의 연산에서 Raw pointer와 같은 명령을 수행합니다. 이것은 메모리 및 CPU의 사용에서 Raw pointer에 비해 무겁지 않음을 의미하고, Raw pointer를 사용할 때의 비용과 거의 동일하다는 뜻이 됩니다. 선언 및 사용은 아래와 같이 할 수 있습니다. #include #..
-
[Effective Modern C++] Special member functionC++/Effective Modern C++ 2022. 5. 5. 13:38
특수 멤버 함수(Special member function)는 C++이 자동으로 작성하는 멤버 함수들을 가리킵니다. C++98까지는 기본 생성자, 소멸자, 복사 생성자, 복사 배정 연산자가 이에 해당되었고, C++11에 이동 시맨틱이 추가되면서 이동 생성자, 이동 배정 연산자가 추가되었습니다. 위 함수들은 클라이언트 코드에서 호출되었을 경우에만 작성되며, 묵시적으로 public이며 inline입니다. 또한, 자동 생성될 때 상위 클래스가 가상 소멸자인 경우를 제외하면 모두 non-virtual함수입니다. 특수 멤버 함수의 작성 조건은 우선적으로 클라이언트 코드에서의 호출이지만, 작성되지 않는 경우도 존재합니다. 특정 조건 하에서 호출되어도 작성되지 않는 경우들이 존재하는데, 대표적인 예시로 기본 생성자의..
-
[Effective Modern C++] const와 Thread safetyC++/Effective Modern C++ 2022. 5. 3. 15:02
const로 선언된 함수는 내부에서 값의 수정이 일어나지 않는다고 기대할 수 있습니다. 그리고 이러한 함수는 멀티스레드 프로그램에서 스레드에 안전할 것 입니다. 하지만, 예외되는 경우가 존재하는데, 이번 글에서는 이에 대해서 살펴보도록 하겠습니다. 생각할 수 있는 가장 간단한 예제는 아래와 같습니다. class MyClass{ public: int calc() const { if (!data_valid){ ... data_valid = true; } return data; } private: mutable bool data_valid { false }; mutable int data { 0 }; }; 함수의 값을 계산하고 캐싱하는 예제입니다. 값에 대한 계산 비용이 큰 값들의 경우 위와 같이 캐싱하는 방..
-
[Effective Modern C++] constexprC++/Effective Modern C++ 2022. 4. 29. 15:23
constexpr은 Constant expression이지만, 기존의 const예약어와는 조금 다릅니다. 개념적으로 constexpr은 해당 값이 상수 뿐 아니라, 컴파일 시점에 알려지는 값을 나타냅니다. 그 외에도 함수, 생성자 등에 적용 가능하다는 특성 또한 존재하며, constexpr이 적용된 식 등이 항상 const하지는 않다는 특징이 있습니다. 단점이 아닌 특징으로, 이것은 constexpr의 기능에 속합니다. 이번 글에서는 constexpr에 대하여 알아보도록 하겠습니다. 1. constexpr객체와 상수성 더보기 constexpr객체는 const이지만, const객체는 constexpr이 아닙니다. 이것은 상수 표현식이 필요한 구문에서 차이를 살펴볼 수 있습니다. 예제를 살펴보도록 하겠습니다..
-
[Effective Modern C++] noexceptC++/Effective Modern C++ 2022. 4. 28. 11:35
예외 처리에 대한 기초적인 내용은 다른 글 (예외 처리)에 간략히 정리되어 있습니다. 함수의 예외 방출 여부는 매우 중요한 사항입니다. 클라이언트(사용자) 입장에서는 기존의 코드를 바꾸어야 할 수도 있고, 컴파일러의 입장에서는 최적화와 관련이 크기 때문입니다. 이렇듯 예외처리에서 가장 중요한것은 예외가 발생할 수 있는지 아닌지의 정보입니다. 이분법적인 정보가 중요한 만큼, C++11에서는 예외를 방출하지 않는 선언을 하는 noexcept 키워드가 추가되었습니다. 1. noexcept와 Stack unwind 더보기 함수에서 예외를 방출하지 않는다는 선언은 다음과 같습니다. //C++98 Style void function() throw(); //C++11 Style void function() noexc..
-
[Effective Modern C++] const_iteratorC++/Effective Modern C++ 2022. 4. 27. 13:39
const_iterator는 문자 그대로 const한 iterator입니다. const를 사용하는게 가능하다면 const를 사용하는 것은 iterator에도 적용이 되어, 값을 수정할 필요가 없을 때에는 const_iterator를 쓰는 것이 바람직합니다. 하지만, C++11 이전에는 이 const_iterator를 사용하는 것이 조금 난해했습니다. 이번 글에서는 const_iterator에 대하여 다루어 보겠습니다. std::vector에서 1이라는 값을 찾고 그 앞에 2를 삽입하는, 혹은 값이 존재하지 않을 경우 벡터의 끝에 2를 삽입하는 코드는 아래와 같이 작성할 수 있습니다. std::vector vec; ... std::vector::iterator it = std::find(vec.begin(..