2024/12 3

[Effective Modern C++] 항목 41 ~ 42 : 다듬기

항목 41 : 값 전달 함수가 좋은 경우아래 조건이 만족하면 사용자 정의 클래스 매개변수도 값전달이 유용할 수 있다.1. 이동이 싸다2. 함수가 해당 매개변수를 결국 내부에서 복사하는데 사용한다.3. 복사 가능 타입 예시)class Widget {public: void addName(const std::string& newName) { names.push_back(newName); } void addName(std::string&& newName) { names.push_back(std::move(newName); } ...}class Widget {public: void addName(std::string newName) { names.push_back(std::move(newName)..

[Effective Modern C++] 항목 35 ~ 40 : 동시성 API

항목 36 : std::thread, std::asyncstd::thread t(doAsyncFunctionPointer)는 실제 시스템 스레드를 생성하여 넘겨준 함수 포인터를 실행시킨다. 이러한 std::thead를 활용하는 것을 스레드 기반 프로그래밍이라고 한다. 이때 무조건 시스템 스레드를 생성하기에 스레드 고갈, 과다 구독, 부하 균형화 등의 스레드 관리를 수동으로 모두 해야한다.auto f = std::async( doAsyncFunctionPointer)는 넘겨준 함수 포인터를 사용자 관점에 비동기 동시적으로 테스크라는 단위로써 수행해주는데 무조건 시스템 스레드를 생성하지는 않는다. 대신 내부적으로 알아서 적절하게 시스템 스레드를 할당하고 적절하게 분배하여 수행한다. 따라서 위에서 언급한 스레..

[Effective Modern C++] 항목 31 ~ 34 : 람다 표현식

항목 31 : 기본 캡처 모드를 피하자 기본 캡처 모드란 =이나 &로 모든 값, 참조를 캡처하는 경우를 말한다.우선 당연히 어떤 요소를 캡처하는지 정확히 명시하지 않기에 디자인상 좋지 않다. 참조 캡처의 경우 캡처 대상들의 수명을 잘 관리해야하는데 이는 치명적이다.하지만 더 큰 문제는 값 캡처의 경우에도 수명 관리를 고려해야할 수 있다는 점이다.기본적으로 멤버 함수에서 객체의 멤버는 명시하여 캡처할 수 없다. 하지만 =로 전체 값 캡처를 하면 객체의 멤버에 접근이 가능해진다. 이는 this 포인터가 캡처되고 람다 내에서의 멤버 접근이 자동으로 this->멤버로 수정되기에 가능하다. 그리고 그것은 객체와 객체의 멤버를 참조하므로 객체가 소멸된 상태면 문제를 일으킬 수 있다. 멤버 변수를 진짜 값 캡처하고 ..