목록Tutorials/C++ : Advanced (99)
KoreanFoodie's Study

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 24 : 보편 참조와 오른값 참조를 구별하라 핵심 : 1. 함수 템플릿 매개변수의 형식이 T&& 형태이고 T 가 연역된다면, 또는 객체를 auto&& 로 선언한다면, 그 매개변수나 객체는 보편 참조이다. 2. 형식 선언의 형태가 정확히 형식&& 가 아니면, 또는 형식 연역이 일어나지 않으면, 형식&& 는 오른값 참조를 뜻한다. 3. 오른값으로 초기화되는 보편 참조는 오른값 참조에 해당한다. 왼값으로 초기화되는 보편 참조는 왼값 참조에 해당한다. "T&&" 는 오른값 참조 또는 왼값 참조 중 하나라는 뜻이다. 이러한 참조를 보편 참조(u..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 23 : std::move 와 std::forward 를 숙지하라 핵심 : 1. std::move 는 오른값으로의 무조건 캐스팅을 수행한다. std::move 자체는 아무것도 이동하지 않는다. 2. std::forward 는 주어진 인수가 오른값에 묶인 경우에만 그것을 오른값으로 캐스팅한다. 3. std::move 와 std::forward 둘 다, 실행 시점에서는 아무 일도 하지 않는다. std::move 와 std::forward 는 실행 가능 코드를 한 바이트도 산출하지 않는다. 그들은 그냥 캐스팅을 수행하는 함수(구체적으로는 함..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 22 : Pimpl 관용구를 사용할 때에는 특수 멤버 함수들을 구현 파일에서 정의하라 핵심 : 1. Pimpl 관용구는 클래스 구현과 클래스 클라이언트 사이의 컴파일 의존성을 줄임으로써 빌드 시간을 감소한다. 2. std::unique_ptr 형식의 pImpl 포인터를 사용할 때에는 특수 멤버 함수들을 클래스 헤더에 선언하고 구현 파일에서 구현해야 한다. 컴파일러가 기본으로 작성하는 함수 구현들이 사용하기에 적합한 경우에도 그렇게 해야 한다. 3. 위의 조언은 std::unique_ptr 에 적용될 뿐, std::shared_ptr 에..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 21 : new 를 직접 사용하는 것보다 std::make_unique 와 std::make_shared 를 선호하라 핵심 : 1. new 의 직접 사용에 비해, make 함수를 사용하면 소스 코드 중복의 여지가 없어지고, 예외 안전성이 향상되고, std::make_shared 와 std::allocate_shared 의 경우 더 작고 빠른 코드가 산출된다. 2. make 함수의 사용이 불가능 또는 부적합한 경우로는 커스텀 삭제자를 지정해야 하는 경우와 중괄호 초기치를 전달해야 하는 경우가 있다. 3. std::shared_ptr 에 ..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 20 : std::shared_ptr 처럼 작동하되 대상을 잃을 수도 있는 포인터가 필요하면 std::weak_ptr 를 사용하라 핵심 : 1. std::shared_ptr 처럼 작동하되 대상을 잃을 수도 있는 포인터가 필요하면 std::weak_ptr 를 사용하라 2. std::weak_ptr 의 잠재적인 용도로는 캐싱, 관찰자 목록, 그리고 std::shared_ptr 순환 고리 방지가 있다. std::weak_ptr 는 std::shared_ptr 처럼 동작하되, 객체의 참조 횟수에는 영향을 끼치지 않는다. 대상을 잃은 std::..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 19 : 소유권 공유 자원의 관리에는 std::shared_ptr 를 사용하라 핵심 : 1. std::shared_ptr 는 임의의 공유 자원의 수명을 편리하게(쓰레기 수거에 맡길 때만큼이나) 관리할 수 있는 수단을 제공한다. 2. 대체로 std::shared_ptr 객체는 그 크기가 std::shared_ptr 객체의 두 배이며, 제어 블록에 관련된 추가 부담을 유발하며, 원자적 참조 횟수 조작을 요구한다. 3. 자원은 기본적으로 delete 를 통해 파괴되나, 커스텀 삭제자도 지원된다. 삭제자의 형식은 std::shared_ptr ..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 18 : 소유권 독점 자원의 관리에는 std::unique_ptr 를 사용하라 핵심 : 1. std::unique_ptr 는 독점 소유권 의미론을 가진 자원의 관리를 위한, 작고 빠른 이동 전용 똑똑한 포인터이다. 2. 기본적으로 자원 파괴는 delete 를 통해 일어나나, 커스텀 삭제자를 지정할 수 있다. 상태 있는 삭제자나 함수 포인터를 사용하면 std::unique_ptr 객체의 크기가 커진다. 3. std::unique_ptr 를 std::shared_ptr 로 손쉽게 변환할 수 있다. C++ 에서 생 포인터(raw pointe..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 17 : 특수 멤버 함수들의 자동 작성 조건을 숙지하라 핵심 : 1. 컴파일러가 스스로 작성할 수 있는 멤버 함수들, 즉 기본 생성자와 소멸자, 복사 연산들, 이동 연산들을 가리켜 특수 멤버 함수라고 한다. 2. 이동 연산들은 이동 연산들이나 복사 연산들, 소멸자가 명시적으로 선언되어 있지 않은 클래스에 대해서만 자동으로 작성된다. 3. 복사 생성자는 복사 생성자가 명시적으로 선언되어 있지 않은 클래스에 대해서만 자동으로 작성되며, 만일 이동 연산이 하나라도 선언되어 있으면 삭제된다. 복사 배정 연산자는 복사 배정 연산자가 명시적으로 ..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 16 : const 멤버 함수를 스레드에 안전하게 작성하라 핵심 : 1. 동시적 문맥에서 쓰이지 않을 것이 확실한 경우가 아니라면, const 멤버 함수는 스레드에 안전하게 작성하라. 2. std::atomic 변수는 mutex 에 비해 성능상의 이점이 있지만, 하나의 변수 또는 메모리 장소를 다룰 때에만 적합하다. 다음과 같은 다항식 클래스가 있다고 하자. class Polynomial { public: using RootsType = std::vector; RootsType roots() const { // 캐시가 유효하지 않으면 ..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 15 : 가능하면 항상 constexpr 를 사용하라 핵심 : 1. constexpr 객체는 const 이며, 컴파일 도중에 알려지는 값들로 초기화된다. 2. constexpr 함수는 그 값이 컴파일 도중에 알려지는 인수들로 호출하는 경우에는 컴파일 시점 결과를 산출한다. 3. constexpr 객체나 함수는 비constexpr 객체나 함수보다 광범위한 문맥에서 사용할 수 있다. 4. constexpr 은 객체나 함수의 인터페이스의 일부이다. 개념적으로, constexpr 는 어떠한 값이 단지 상수일 뿐만 아니라 컴파일 시점에서 알려진..