C++11부터 noexcept
지정자가 도입되었습니다. 이것은 함수가 예외를 던지지 않음을 보증하는 데 사용됩니다. noexcept
지정자는 함수가 예외를 던질 가능성이 없음을 명시적으로 나타내므로, 컴파일러는 이를 고려하여 최적화를 수행할 수 있습니다.
noexcept
지정자의 사용
noexcept
지정자는 함수 선언 뒤에 붙일 수 있습니다. 함수가 예외를 던질 가능성이 있는지 표시하려면 noexcept
키워드를 사용하고, 반대로 함수가 예외를 던지지 않음을 명시하려면 noexcept(true)
또는 noexcept
만 사용하면 됩니다.
예를 들어,
void func1() noexcept {
// 예외를 던질 가능성이 없음
}
void func2() {
// 예외를 던질 가능성이 있음
}
noexcept
와 성능
noexcept
지정자를 사용하면 예외 처리 코드가 없어지므로, 컴파일러는 해당 함수를 최적화할 수 있습니다. 예외 처리 코드를 생성하지 않는 대신 해당 함수를 호출하는 곳에서 예외 처리를 위한 추가 코드를 생성할 필요가 없어지기 때문에 성능상의 이점을 얻을 수 있습니다.
또한, 표준 라이브러리의 컨테이너와 알고리즘은 noexcept
지정자를 사용하여 예외 안전 보장을 제공하고 있습니다. 따라서 사용자가 컨테이너나 알고리즘을 사용할 때도 noexcept
지정자를 고려해야 합니다.
noexcept
와 이동 생성자/이동 할당 연산자
noexcept
지정자는 이동 생성자와 이동 할당 연산자에서 특히 중요합니다. 이러한 함수들이 예외를 던지지 않음을 명시하는 것이 중요하기 때문에, C++ 표준라이브러리에는 이동 생성자와 이동 할당 연산자에서 noexcept
지정자를 사용하도록 권장하는 경우가 많습니다.
따라서 이동 생성자와 이동 할당 연산자에서 noexcept
지정자를 사용하여 예외 안전성을 보장할 수 있습니다.
noexcept
지정자는 성능 최적화와 예외 안전성을 제공하는데 중요한 역할을 합니다. 개발자는 이를 적절히 활용하여 안정성과 성능을 동시에 고려해야 합니다.
참고 자료
- https://en.cppreference.com/w/cpp/language/noexcept_spec