전체 글50 18. 소유권 독점 자원의 관리에는 std::unique_ptr을 사용하라. - std::unique_ptr는 독점 소유권 의미론을 가진 자원의 관리를 위한, 작고 빠른 이동 전용 스마트 포인터이다. std::unique_ptr는 기본적으로 생 포인터와 같은 크기라고 가정할 수 있으며, 대부분의 연산(역참조를 비롯해서)에서 생 포인터와 정확히 동일한 명령들을 실행한다. std::unique_ptr는 독점적 소유권(exclusive ownership) 의미론을 재현하고 있다. 널이 아닌 std::unique_ptr는 항상 자신이 가리키는 객체를 소유한다. std::unique_ptr를 이동하면 소유권이 원본 포인터에서 대상 포인터로 옮겨진다(원본 포인터는 널로 설정된다). std::unique_ptr의 복사는 허용되지 않는다. 만일 복사가 허용되면, 두 std::unique_ptr.. 2021. 3. 9. 17. 특수 멤버 함수들의 자동 작성 조건을 숙지하라. - 컴파일러가 스스로 작성할 수 있는 멤버 함수들, 즉 기본 생성자와 소멸자, 복사 연산자들, 이동 연산자들을 가리켜 특수 멤버 함수라고 부른다. 1. 기본 생성자 : C++98의 규칙들과 같다. 클래스에 사용자 선언 생성자가 없는 경우에만 자동으로 작성된다. 2. 소멸자 : C++98의 규칙들과 본질적으로 같다. 유일한 차이점은 소멸자가 기본적으로 noexcept라는 점이다. C++98처럼 기본적으로 작성되는 소멸자는 오직 기반 클래스 소멸자가 가상일 때에만 가상이다. 3. 복사 생성자 : 실행시점 행동은 C++98의 것과 같다. 즉, 비정적 데이터 멤버들을 멤버별로 복사 생성한다. 클래스에 사용자 선언 복사 생성자가 없을 때에만 자동으로 작성된다. 클래스에 이동 연산이 하나라도 선언되어 있으면 삭제(.. 2021. 3. 9. 16. const 멤버 함수를 스레드에 안전하게 작성하라. - 동시적 문맥에서 쓰이지 않을 것이 확실한 경우가 아니라면, const 멤버 함수는 스레드에 안전하게 작성하라. 다항식을 대표하는 클래스를 만든다고 하자. 이 클래스가 유용하려면 다항식의 근을 계산하는 멤버 함수를 갖추어야 할 것이다. 그런 함수는 다항식을 수정하지 않을 것이므로, const로 선언하는 것이 자연스럽다. 다항식 근의 계산 비용이 클 수 있으므로, 꼭 필요할 때에만 계산하는 것이 바람직하다. 즉, 필요할 때에만 근(들)을 실제로 계산해서 캐시에 저장하고, 그렇지 않을 때에는 그냥 캐시에 있는 값을 돌려주도록 구현하는 것이 바람직하다. class Polynomial { public: using RootsType = std::vector; RootsType roots(void) const {.. 2021. 3. 9. 15. 가능하면 항상 constexpr을 사용하라. - constexpr 객체는 const이며, 컴파일 도중에 알려지는 값들로 초기화된다. 컴파일 시점에 알려지는 값들에는 특별한 권한이 있다. 예를 들어 그런 값들을 읽기 전용 메모리에 배치될 수 있다. 좀 더 광범위한 프로그래머들에게 중요한 점은, 상수이자 컴파일 시점에 알려진 정수 값을 C++에서 정수 상수 표현식이 요구되는 문맥에서 사용할 수 있다는 것이다. 배열 크기나 정수 템플릿 인수, 열거자 값, 정합 지정자를 지정하는 등의 여러 문맥이 그런 문맥에 해당한다. int sz; // 비constexpr 변수 constexpr auto arraySize1 = sz; // 오류! sz의 값이 컴파일 도중에 알려지지 않음 std::array data1; // 오류! 같은 문제 constexpr auto .. 2020. 12. 27. 이전 1 2 3 4 5 6 7 ··· 13 다음