msdn :
c++ 11의 noexcept는 함수가 예외를 throw 할 수 있는지 여부를 지정한다.
Effective Modern C++ :
함수 선언 시 그 함수가 예외를 방출하지 않을 것임을 명시할 때는 noexcept 키워드를 사용하면 된다. 함수를 noexcept로 선언할 것인지의 여부는 인터페이스 설계상의 문제이다. 함수의 예외 방출 행동은 클라이언트에게 아주 중요한 사항이다. 함수의 호출자는 함수의 noexcept 여부를 조회할 수 있으며, 그 조회 결과는 호출 코드의 예외 안정성이나 효율성에 영향을 미친다. 그러므로 함수의 noexcept 여부는 멤버 함수의 const 여부만큼이나 중요한 정보다.
- noexcept 함수는 비 noexcept 함수보다 최적화의 여지가 크다.
- noexcept는 이동 연산들과 swap, 메모리 해제 함수들, 그리고 소멸자들에 특히나 유용하다.
- 대부분의 함수는 noexcept가 아니라 예외에 중립적이다.
http://en.cppreference.com/w/cpp/language/noexcept :
noexcept 키워드는 연산자(operator)의 형태로, 그리고 한정자(specifier)의 형태로 제공된다.
(1) 연산자
noexcept 연산자는 컴파일 타임에 해당 표현식이 예외를 던지지 않는 표현식인지 체크하여, true/false를 반환한다.
표현식이 다음의 경우 중 하나라도 포함하고 있으면, noexcept는 false를 반환하며, 그렇지 않은 경우엔 true를 반환한다.
- 상수 표현식이 아닌 함수가 noexcept 키워드를 가지지 않을 경우
- 런타임 체크가 필요한 dynamic_cast 등의 RTTI가 포함된 경우
- typeid 표현식에 포함된 타입이 상속 관계에 있는 클래스나 구조체일 경우
(2) 한정자
noexcept 한정자는 다음의 형식으로 사용할 수 있으며, 함수가 예외를 던질 수 있는지(false) 없는지(true)를 명시한다.
언제 써야 할까?
noexcept 한정자가 붙은 함수에 대해서 컴파일러는 특정한 최적화를 진행할 수 있다.
이것이 정확히 어떤 메커니즘의 최적화인지는 모르겠지만, 큰 최적화는 아닌 것으로 알고 있다.
즉, 컴파일 단계에서의 최적화를 이유로만 noexcept 한정자를 쓰라는 것은 아니라는 얘기다.
noexcept를 쓰는 가장 큰 이유는 strong exception guarantee여야 한다.
이것이 왜 필요하냐?
C++11 이후 std::vector뿐 아니라 STL 컨테이너들은 move semantics가 모두 적용되어 있다.
원소에 대한 이동 처리를 할 때 해당 원소가 move시 noexcept를 지원하지 않으면,
move semantics가 아닌 copy semantics로 element를 처리한다.
즉, 이동 처리에 대한 strong exception guarantee가 되어 있지 않으면 move semantics의 장점을 포기하는 것이다.
참고
'C, C++ > Modern C++' 카테고리의 다른 글
[C++ 11] 중괄호 초기화, 초기화 리스트(Initialize List) (0) | 2022.04.21 |
---|---|
[C++ 11] 복사 생략(Copy Elision) (0) | 2022.04.21 |
[C++] 스마트 포인터 참고할만한 글 (0) | 2021.12.22 |