본문 바로가기

전체 글

이펙티브 모던 C++_8 [Effective Modern C++] 2015 스콧 마이어스 저 " C++11 과 C++ 14 를 효과적으로 사용하는 42가지 방법 8장 다듬기 항목 41 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달을 고려하라 효율성으로는 보편 참조 > 왼값 참조 + 오른 값 참조(오버 로딩) > 값 전달으로 볼 수 있다. 하지만 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달을 고려하라 단, 값 전달의 경우 잘림 문제가 있을 수 있다. (메모리가 부족할 경우 모두 복사되지 않는 현상 int -> short) * 왼값 인수의 경우 값 전달 다음의 이동 배정은 참조 전달 다음의 복사 배정보다 훨씬 비쌀 가능성이 있다. 값 전달에서는 잘림 문제가 발생할 수 있으므로, 일반적.. 더보기
이펙티브 모던 C++_7 항목 37. std::thread들을 모든 경로에서 합류 불가능하게 만들어라 = 이미 조인되거나, detach된 깔끔한 상태로 만들어라 = joinable 상태에서 소멸자가 호출되면 종료된다. = 나중에 조인될 여지가 있는 스레드를 만들지 말자 ex) 조건이 false일 경우 조인되지 않고 t의 소멸자가 호출되어 프로그램이 종료된다. 종료되는 이유 : 암묵적 join을 할 경우, 올바른 상태가 되기까지 대기할 수는 없다. 종료하는 것이 맞다. 암묵적 detach를 할 경우, 소멸된 변수 localValue에 접근할 가능성이 있다. 종료하는 것이 맞다. => 때문에 joinable 상태의 소멸자가 호출되면 종료시키는 것이 옳다 bool doWork() { int localValue = 6; std::thr.. 더보기
이펙티브 모던 C++_6 [Effective Modern C++] 2015 스콧 마이어스 저 " C++11 과 C++ 14 를 효과적으로 사용하는 42가지 방법 6장 람다 표현식 람다 표현식 : 클로저 : 람다에 의해 만들어진 실행 시점 객체(복사, 참조) 클래스 클로저: 클로저를 만드는 데 쓰인 클래스 항목 31 기본 갈무리 모드를 피하라 -갈무리는 값, 참조가 대상을 잃을 위험이 있다. (대상 값이 변경/지워진 후 람다가 실행될 경우) -람다는 바로 사용하는 것이 좋다. -람다는 생성된 범위 내에 보이는 지역 변수에만 해당된다. class Widget { public: ... void addFilter() const; private: int divisor; }; void Widget::addFilter() const { //.. 더보기
이펙티브 모던 C++_5 [Effective Modern C++] 2015 스콧 마이어스 저 " C++11 과 C++ 14 를 효과적으로 사용하는 42가지 방법 5장 오른값 참조, 이동 의미론, 완벽 전달 항목 23. std::move와 std::forward 를 숙지하라 : std::move는 이동하는것이 아니라 사실상 static_cast만 수행한다. 기술적으로 std::forward만 사용해도 문제는 없지만 타자량, 잘못된 형식을 지정하는 실수를 방지한다는 점에서 std::move 사용도 지향된다. 1. 이동을 지원할 객체는 const로 선언하지 말아야 한다. 복사 연산으로 변환된다. 2. std::move는 rvalue로의 캐스팅만 수행, std::forward는 rlvalue인 경우에만 수행 항목 24. 보편 참조와 오.. 더보기
이펙티브 모던 C++_4 [Effective Modern C++] 2015 스콧 마이어스 저 " C++11 과 C++ 14 를 효과적으로 사용하는 42가지 방법 4장 똑똑한 포인터 1. auto_ptr 2. unique_ptr 3. shared_ptr 4. weak_ptr 항목 18. 소유권 독점 자원의 관리에는 std::unique_ptr을 사용하라 unique_ptr : 1. 자신이 가리키는 객체를 소유한다. 2. 이동하면 원본 포인터는 nullptr이 된다. (이동 전용 형식) 3. 복사는 허용되지 않는다. 4. 파괴는 delete를 통해 일어나지만 커스텀 삭제자를 사용하도록 지정하는 것도 가능 class Test { }; auto Deleter(Test* p) { delete p; } int main() { // 일반적으.. 더보기
이펙티브 모던 C++_3 [Effective Modern C++] 2015 스콧 마이어스 저 " C++11 과 C++ 14 를 효과적으로 사용하는 42가지 방법 항목 11. 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라 ex) int Secret() = delete; -어떤 방법으로도 사용할 수 없다. -멤버 함수나 friend 함수에서 복사하려 하면 컴파일이 실패한다. -주로 public 에 선언한다. ** 원치 않은 사용은 원천 봉쇄한다. 항목 12. 재정의 함수들을 override로 선언하라 - override를 사용하지 않으면 부모 클래스의 함수 재정의를 시도할 때 *기반 클래스 함수가 반드시 가상 함수 *기반 함수와 파생 함수의 이름이 반드시 동일 *기반 함수와 파생 함수의 매개변수 형식이 동일 *기반 함수와 파.. 더보기
이펙티브 모던 C++_2 [Effective Modern C++] 2015 스콧 마이어스 저 " C++11 과 C++ 14 를 효과적으로 사용하는 42가지 방법 2장 항목 5. 명시적 형식 선언보다는 auto를 선호하라 [이유] 1. 사용하기 편리하다. 2. 초기화를 강제시켜준다. 3. 클로저에서 요구되는 만큼의 메모리만 사용한다. (std::function 은 가변 가능성 때문에 힙 메모리 할당) 4. 이식성 (32 비트에서 unsigned 와 std::vectorsize_type 은 같지만 64비트에서는..) 항목 6. auto가 원치 않은 형식으로 연역될 때에는 명식적 형식의 초기치를 사용하라 auto 변수의 형식은 변수의 초기화에 쓰이는 표현식으로부터 연역된다. Q. 함수 내부 구조로 잘못 연역될 수 있는 경우가 있다. .. 더보기
이펙티브 모던 C++_1 [Effective Modern C++] 2015 스콧 마이어스 저 " C++11 과 C++ 14 를 효과적으로 사용하는 42가지 방법 1장 형식 영역 1. 템플릿 형식 연역 규칙을 숙지하라 1.1 템플릿 형식 연역 도중에 참조 형식의 인수들은 비참조로 취급된다. 즉, 참조성이 무시된다. 1.2 보편 참조 매개변수에 대한 형식 연역 과정에서 왼값 인수들은 특별하게 취급된다. 1.3 값 전달 방식의 매개변수에 대한 형식 연역 과정에서 const 또는 volatile(또는 그 둘 다인) 인수는 비 const, 비 volatile 인수로 취급된다. **template T와 ParamType T의 형식이 달라질 수 있다. 1.4. 템플릿 형식 연역 과정에서 배열이나 함수 이름에 해당하는 인수는 포인터로 붕괴한다.. 더보기