목록Tutorials (196)
KoreanFoodie's Study
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 39 : 단발성 사건 통신에는 void 미래 객체를 고려하라 핵심 : 1. 간단한 사건 통신을 수행할 때, 조건 변수 기반 설계에는 여분의 뮤텍스가 필요하고, 검출 과제와 반응 과제의 진행 순서에 제약이 있으며, 사건이 실제로 발생했는지를 반응 과제가 다시 확인해야 한다. 2. 플래그 기반 설계를 사용하면 그런 단점들이 없지만, 대신 차단이 아니라 폴링이 일어난다는 단점이 있다. 3. 조건 변수와 플래그를 조합할 수도 있으나, 그런 조합을 이용한 통신 메커니즘은 필요 이상으로 복잡하다. 4. std::promise 와 미래 객체를 사용..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 38 : 스레드 핸들 소멸자들의 다양한 행동 방식을 주의하라 핵심 : 1. 미래 객체의 소멸자는 그냥 미래 객체의 자료 멤버들을 파괴할 뿐이다. 2. std::async 를 통해 시동된 비지연 과제에 대한 공유 상태를 참조하는 마지막 미래 객체의 소멸자는 그 과제가 완료될 때까지 차단된다(기다린다). 합류 가능 std::thread 는 바탕 시스템의 실행 스레드에 대응된다. 그와 비슷하게 지연되지 않은 과제에 대한 미래 객체도 시스템 스레드에 대응된다. 따라서 std::thread 객체와 미래 객체 모두 시스템 스레드에 대한 핸들(ha..
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 여부까지도 전달해야 한다. 예시를 보자...