티스토리 뷰

 

Effective Modern 이펙티브 모던 C++

 

차례

1장. 형식 연역
2장. auto
3장. 현대적 C++ 적응하기
4장. 스마트 포인터
5장. 오른값 참조, 이동 의미론, 완벽 전달
6장. 람다 표현식
7장. 동시성 API
8장. 다듬기 

 

Item 15: 가능하면 항상 constexpr을 사용하라

C++11 제약 사항
- constexpr 함수는 실행 가능 문장이 많아야 하나이어야 하고, 보통의 경우 그 문장은 return 문일 수밖에 없다.
- constexpr 멤버 함수는 암묵적으로 const로 선언된다.
- void를 반환하는 constexpr 함수는 리터럴 형식이 아니다.

C++14에서는 위의 C++11의 제약 사항이 사라짐

기억해 둘 사항들

- constexpr 객체는 const이며, 컴파일 도중에 알려지는 값들로 초기화된다.
- constexpr 함수는 그 값이 컴파일 도중에 알려지는 인수들로 호출하는 경우에는 컴파일 시점 결과를 산출한다.
- constexpr 객체나 함수는 비constexpr 객체나 함수보다 광범위한 문맥에서 사용할 수 있다.
- constexpr은 객체나 함수의 인터페이스의 일부이다.

 

Item 16: const 멤버 함수를 스레드에 안전하게 작성하라

뮤텍스를 이용해 const 멤버 함수를 스레드 안전하게 작성하는 예

기억해 둘 사항들

- 동시적 문맥에서 쓰이지 않는 것이 확실한 경우가 아니라면, const 맴버 함수는 스레드에 안전하게 작성하라.
- std::atomic 변수는 뮤텍스에 비해 성능상의 이점이 있지만, 하나의 변수 또는 메모리 장소를 다룰 때에만 적합하다.

 

Item 17: 특수 멤버 함수들의 자동 작성 조건을 숙지하라

이동 생성자(move constructor)와 이동 배정 연산자(move assignment operator)

 

3의 법칙(Rules of Three)

만일 복사 생성자와 복사 배정 생성자, 소멸자 중 하나라도 선언했다면 나머지 둘로(즉, 셋다) 선언해야 한다.

클래스에 대한 이동 연산들은 다음 세 조건이 모두 만족될 때에만, 그리고 필요할 때에만, 자동으로 작성된다.
- 클래스에 그 어떤 복사 연산도 선언되어 있지 않다.
- 클래스에 그 어떤 이동 연산도 선언되어 있지 않다.
- 클래스에 소멸자가 선언되어 있지 않다.

C++11에서는 복사 연산이나 소멸자를 선언하는 클래스에 대한 복사 연산들의 자동 작성이 비권장 기능으로 분류되었기 때문에 복사 연산들도 위의 규칙이 어느 정도는 적용된다.

C++11의 기본 생성자와 소멸자에 관한 규칙들은 C++98의 규칙들과 거의 같다.

기억해 둘 사항들

- 컴파일러가 스스로 작성할 수 있는 멤버 함수들, 즉 기본 생성자와 소멸자, 복사 연산들, 이동 연산들을 가리켜 특수 멤버 함수라고 부른다.
- 이동 연산들은 이동 연산들이나 복사 연산들, 소멸자가 명시적을 선언되어 있지 않은 클래스에 대해서만 자동으로 생성된다.
- 복사 생성자는 복사 생성자가 명시적으로 선언되어 있지 않은 클래스에 대해서만 자동으로 작성되며, 만일 이동 연산이 하나라도 선언되어 있으면 삭제된다. 복사 배정 연산자는 복사 배정 연산자가 명시적으로 선언되어 있지 않은 클래스에 대해서만 자동으로 작성되며, 만일 이동 연산이 하나라도 선언되어 있으면 삭제된다. 소멸자가 명시적으로 선언된 클래스에서 복사 연산들이 자동 작성되는 기능은 비권장이다.
- 멤버 함수 템플릿 때문에 특수 멤버 함수의 자동 작성이 금지되는 경우는 전혀 없다.

 

참고

예제, https://github.com/BartVandewoestyne/Effective-Modern-Cpp

 

- James Song

댓글