목록Categories (1099)
KoreanFoodie's Study
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 37 : std::thread 들을 모든 경로에서 합류 불가능하게 만들어라 핵심 : 1. 모든 경로에서 std::thread 를 합류 불가능으로 만들어라. 2. 소멸 시 join 방식은 디버깅하기 어려운 성능 이상으로 이어질 수 있다. 3. 소멸 시 detach 방식은 디버깅하기 어려운 미정의 행동으로 이어질 수 있다. 4. 자료 멤버 목록에서 std::thread 객체를 마지막에 선언하라. 모든 std::thread 객체는 합류 가능(joinable) 상태이거나 합류 불가능(unjoinable) 상태이다. 합류 가능 std::thre..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 36 : 비동기성이 필수일 때에는 std::launch::async 를 지정하라 핵심 : 1. std::async 의 기본 시동 방침은 과제의 비동기적 실행과 동기적 실행을 모두 허용한다. 2. 그러나 이러한 유연성 때문에 thread_local 접근의 불확실성이 발생하고, 과제가 절대로 실행되지 않을 수도 있고, 시간 만료 기반 wait 호출에 대한 프로그램 논리에도 영향이 간다. 3. 과제를 반드시 비동기적으로 실행해야 한다면 std::launch::async 를 지정하라. std::async 그 함수를 비동기적으로 실행하겠다는 의..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 35 : 스레드 기반 프로그래밍보다 과제 기반 프로그래밍을 선호하라 핵심 : 1. std::thread API 에서는 비동기적으로 실행된 함수의 반환값을 직접 얻을 수 없으며, 만일 그런 함수가 예외를 던지면 프로그램이 종료된다. 2. 스레드 기반 프로그래밍에서는 스레드 고갈, 과다구독, 부하 균형화, 새 플랫폼으로의 적응을 독자가 직접 처리해야 한다. 3. std::async 와 기본 시동 방침을 이용한 과제 기반 프로그래밍은 그런 대부분의 문제를 알아서 처리해준다. doAsyncWork 라는 함수를 비동기적으로 실행한다고 하자. 방..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 34 : std::bind 보다 람다를 선호하라 핵심 : 1. std::bind 를 사용하는 것보다 람다가 더 읽기 쉽고 표현력이 좋다. 그리고 더 효율적이다. 2. C++14 가 아닌 C++11 에서는 이동 갈무리를 구현하거나 객체를 템플릿화된 함수 호출 연산자에 묶으려 할 때 std::bind 가 유용할 수 있다. C++11 에서는 거의 항상, C++14 에서는 확고하게 람다가 std::bind 에 비해 우월한 선택이다. 다음과 같은 예시를 보자. // 시간상의 한 지점을 대표하는 형식 별칭 using Time = std::chro..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 33 : std::forward 를 통해 전달할 auto&& 매개변수에는 decltype 을 사용하라 핵심 : 1. std::forward 를 통해 전달할 auto&& 매개변수에는 decltype 을 사용하라. C+14 에서 가장 고무적인 기능은 일반적 람다(generic lambdas), 즉 매개 변수에 auto 를 사용하는 람다이다. 예시를 보자. auto f = [](auto x) { return normalized(x); }; 위 람다가 산출하는 클로저 클래스의 함수 호출 연산자는 다음과 같을 것이다. class 컴파일러가_만든..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 32 : 객체를 클로저 안으로 이동하려면 초기화 갈무리를 사용하라 핵심 : 1. 객체를 클로저 안으로 이동할 때에는 C++14 의 초기화 갈무리를 사용하라. 2. C++11 에서는 직접 작성한 클래스나 std::bind 로 초기화 갈무리를 흉내낼 수 있다. 람다 사용시 값 갈무리와 참조 갈무리가 마땅치 않은 경우가 있다. 이동 전용 객체(std::unique_ptr, std::future 등)이 좋은 예이다. C++14 에서는 객체를 클로저 안으로 이동하는 수단을 직접 제공한다. C++11 에서도 이동 갈무리를 흉내낼 수 있다. 초기화..
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&& 같은..