본문 바로가기

개발 Note/C++11,14 (modern C++)

effective modern c++: noexcept 선언

반응형

noexcept 에 대한 내용입니다.


effective modern c++ 에서 이와 관련된 내용을 다루고 있는데요.

간략한 요약및 꼭 숙지해둘 만한 내용을 적어봤습니다.


항목 14: 예외를 방출하지 않을 함수는 noexcept로 선언하라


exception 은 c++ 98에서 추가되었던 내용입니다. 하지만, 이는 득보다 실이 크다는 것을 많은 C++ 개발자들이 경험했을 것입니다.

함수 구현과 예외 명세, 클라이언트 코드 사이의 일관성 유지에 아무런 도움이 안되었죠.


c++ 11에서는 noexcept라는 키워드를 통해서 클라이언트에게 예외처리가 필요한지 아닌지에 대한 매우 중요한 정보를 전달 할 수 있게 되었습니다.

interface 설계시 매우 중요한 역할을 합니다.


물론 c++98 에서도 throw() 로도 이런 역할을 충분히 할 수 있었습니다.


int f(int x) throw();   //f는 예외를 던지지 않음 : C++98 방식

int f(int x) noexcept; // f는 예외를 던지지 않음 : C++11 방식


throw() 의 경우에는 f가 불린 지점까지의 callstack이 풀리게 됩니다. 그리고 나서 뭔가 처리를 하고 종료(terminate)됩니다.

noexcept의 경우에는 호출 스택이 풀릴 수도 있고 그렇지 않을 수도 있습니다.(좀더 자료 조사가 필요한 부분이네요.)


이런 특성때문에 noexcept로 선언하여 사용하는 경우가 throw()를 사용하는 경우보다 최적화 여지가 더 크다고 합니다.



또 하나의 가장 중요한 기억해야 할 점은,


C++11에서는 기본적으로 모든 메모리 해제 함수와 모든 소멸자 함수는 암묵적으로 noexcept입니다. 따라서 noexcept를 직접 선언할 필요가 없습니다.

만약 소멸자에서 예외를 던지고 싶다면, noexcept(false)로 명시적으로 예외를 발생 시키겠다고 선언한 경우 뿐입니다.


하지만, 기본적으로 C++98이든 C++11이든 소멸자에서 예외를 던지는 것은 나쁜 코딩 습관으로 간주합니다. 

이런 코딩은 안하도록 하는 것이 좋겠죠.^^