목록Categories (1104)
KoreanFoodie's Study

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 31 : 기본 갈무리 모드를 피하라 핵심 : 1. 기본 참조 갈무리는 참조가 대상을 잃을 위험이 있다. 2. 기본 값 갈무리는 포인터(특히 this)가 대상을 잃을 수 있으며, 람다가 자기 완결적이라는 오해를 부를 수 있다. 항목을 들어가기 전, 자주 나오는 용어를 다시 한번 짚고 넘어가겠다. 람다 표현식(lambda expression) : 이름 그대로 하나의 표현식으로, 소스 코드에서 "[ ]( ){ }" 로 표현되는 부분이다. 클로저(closure) : 람다에 의해 만들어진 실행 시점 객체. 갈무리 모드(capture mode)에..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 30 : 완벽 전달이 실패하는 경우들을 잘 알아두라 핵심 : 1. 완벽 전달은 템플릿 형식 연역이 실패하거나 틀린 형식을 연역했을 때 실패한다. 2. 인수가 중괄호 초기치이거나 0 또는 NULL 로 표현된 널 포인터, 선언만 된 정수 static const 및 constexpr 자료 멤버, 템플릿 및 중복적재된 함수 이름, 비트필드이면 완벽 전달이 실패한다. 완벽 전달은 단순히 객체들을 전달하는 것만이 아니라, 그 객체들의 주요 특징, 즉 형식, 왼값/오른값 여부, const 나 volatile 여부까지도 전달해야 한다. 예시를 보자...

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 29 : 이동 연산이 존재하지 않고, 저렴하지 않고, 적용되지 않는다고 가정하라 핵심 : 1. 이동 연산들이 존재하지 않고, 저렴하지 않고, 적용되지 않을 것이라고 가정하자. 2. 형식들과 이동 의미론 지원 여부를 미리 알 수 있는 경우에는 그런 가정을 둘 필요가 없다. 아마 C++11 에서 가장 주된 가능은 이동 의미론(move semantics) 일 것이다. 하지만 모든 경우에 이동 연산이 가능한 것은 아니고, 또 복사보다 저렴한 것은 아니다. 예를 들어, std::vector 의 경우 std::move 연산은, 컨테이너에 있는 요..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 28 : 참조 축약을 숙지하라 핵심 : 1. 참조 축약은 템플릿 인스턴스화, auto 형식 연역, typedef 과 별칭 선언의 지정 및 사용, decltype 의 지정 및 사용이라는 네 가지 문맥에서 일어난다. 2. 컴파일러가 참조 축약 문맥에서 참조에 대한 참조를 만들어내면, 그 결과는 하나의 참조가 된다. 원래의 두 참조 중 하나라도 왼값 참조이면 결과는 왼값 참조이고, 그렇지 않으면 오른값 참조이다. 3. 형식 연역이 왼값과 오른값을 구분하는 문맥과 참조 축약이 일어나는 문맥에서 보편 참조는 오른값 참조이다. 우리는 T&& 같은..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 27 : 보편 참조에 대한 중복적재 대신 사용할 수 있는 기법들을 알아 두라 핵심 : 1. 보편 참조와 중복적재의 조합에 대한 대안으로는 구별되는 함수 이름 사용, 매개변수를 const 에 대한 왼값 참조로 전달, 매개변수를 값으로 전달, 꼬리표 배분 사용 등이 있다. 2. std::enable_if 를 이용해서 템플릿의 인스턴스화를 제한함으로써 보편 참조와 중복적재를 함께 사용할 수 있다. std::enable_if 는 컴파일러가 보편 참조 중복적재를 사용하는 조건을 프로그래머가 직접 제어하는 용도로 쓰인다. 3. 보편 참조 매개변수..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 26 : 보편 참조에 대한 중복적재를 피하라 핵심 : 1. 보편 참조에 대한 중복적재는 거의 항상 보편 참조 중복적재 버전이 예상보다 자주 호출되는 상황으로 이어진다. 2. 완벽 전달 생성자들은 특히나 문제가 많다. 그런 생성자는 대체로 비const 왼값에 대한 복사 생성자보다 더 나은 부합이며, 기반 클래스 복사 및 이동 생성자들에 대한 파생 클래스들의 호출들을 가로챌 수 있기 때문이다. 다음과 같은 코드가 있다고 가정하자. std::multiset names; void logAndAdd(const std::string& name) ..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 25 : 오른값 참조에는 std::move 를, 보편 참조에는 std::forward 를 사용하라 핵심 : 1. 오른값 참조나 보편 참조가 마지막으로 쓰이는 지점에서, 오른값 참조에는 std::move 를, 보편 참조에는 std::forward 를 적용하라. 2. 결과를 값 전달 방식으로 돌려주는 함수가 오른값 참조나 보편 참조를 돌려줄 때에도 각각 std::move 나 std::forward 를 적용하라. 3. 반환값 최적화의 대상이 될 수 있는 지역 객체에는 절대로 std::move 나 std::forward 를 적용하지 말아야 한..

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 에..