[c++] noexcept 지정과 성능

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 지정자는 성능 최적화와 예외 안전성을 제공하는데 중요한 역할을 합니다. 개발자는 이를 적절히 활용하여 안정성과 성능을 동시에 고려해야 합니다.

참고 자료