C++

[C++] noexcept

코딩 메모장 2024. 11. 11. 20:46
728x90

noexcept는 C++에서 함수가 예외를 발생시키지 않을 것임을 명시하는 데 사용되는 지정자입니다. C++11에서 도입되었으며, 이를 통해 컴파일러는 최적화를 수행할 수 있고, 코드의 안정성을 높일 수 있습니다. noexcept는 특히 안전한 함수 호출과 효율적인 코드 작성에 도움을 줍니다.

기본 사용법

noexcept는 함수 선언 시 사용하여 해당 함수가 예외를 던지지 않음을 컴파일러에게 알려줍니다. 다음과 같은 형식으로 선언할 수 있습니다.

void myFunction() noexcept {
    // 예외를 발생시키지 않는 코드
}

noexcept 사용 예제

-기본 예제

#include <iostream>

void safeFunction() noexcept {
    std::cout << "This function will not throw exceptions." << std::endl;
}

void unsafeFunction() {
    throw std::runtime_error("This function may throw.");
}

int main() {
    safeFunction();
    
    try {
        unsafeFunction();
    } catch (const std::exception& e) {
        std::cout << "Caught exception: " << e.what() << std::endl;
    }

    return 0;
}

 

safeFunction은 noexcept로 선언되었기 때문에 예외를 발생시키지 않음을 보장합니다. 만약 이 함수에서 예외가 발생한다면 std::terminate가 호출됩니다.

 

-조건부 noexcept

C++11 이후로 noexcept는 조건부로도 사용할 수 있습니다. 예를 들어, 함수가 호출되는 조건에 따라 예외를 던질 수 있는지 판단하여 noexcept 여부를 동적으로 결정할 수 있습니다.

#include <iostream>
#include <type_traits>

void potentiallyThrow() {
    throw std::runtime_error("Error");
}

template <typename T>
void myFunction() noexcept(noexcept(T{}())) {
    T{}();  // 호출이 예외를 발생시키지 않으면 noexcept(true)
}

int main() {
    try {
        myFunction<decltype(potentiallyThrow)>(); // 예외가 발생할 가능성이 있음
    } catch (const std::exception& e) {
        std::cout << "Caught exception: " << e.what() << std::endl;
    }
    return 0;
}

위 예제에서 myFunction은 T 타입이 예외를 던지지 않은 경우에만 noexcept로 평가됩니다.

noexcept의 장점

  1. 성능 최적화:
    • noexcept 함수에 대해 컴파일러는 예외 처리 코드를 생략할 수 있어 성능을 최적화할 수 있습니다. 특히, 이동 생성자나 이동 할당 연산자에서 noexcept를 사용하면 컨테이너의 성능이 향상될 수 있습니다.
  2. 안정성 보장:
    • noexcept로 선언된 함수는 예외를 던지지 않는다는 것을 보장하여 프로그램 안정성에 기여합니다. 만약 noexcept 함수에서 예외가 발생하면 프로그램이 std::terminate로 종료되므로 예기치 않은 동작을 예방할 수 있습니다.
  3. 코드 가독성 향상:
    • noexcept를 사용하면 함수의 예외 발생 가능 여부가 명확해져, 다른 개발자들이 해당 함수의 동작을 쉽게 이해할 수 있습니다.

주의사항

  • noexcept에서 예외 발생 시: noexcept 함수에서 예외가 발생하면 std::terminate가 호출되어 프로그램이 강제로 종료됩니다. 따라서 예외 발생 가능성이 있는 코드에는 noexcept를 지정하지 않는 것이 좋습니다.
  • 필요한 경우에만 사용: 모든 함수에 noexcept를 지정하는 것은 적절하지 않으며, 예외가 발생할 가능성이 전혀 없거나 성능 이점이 필요한 경우에만 사용해야 합니다.

결론

noexcept는 C++에서 예외 처리를 최적화하고 함수의 안전성을 높이기 위해 도입된 중요한 기능입니다. 코드의 성능과 안정성을 높일 수 있지만, 예외 발생 가능성이 있는 경우는 신중하게 적용해야 합니다. 적절히 사용된 noexcept는 코드의 가독성과 유지 보수성을 높이는 데 큰 도움이 될 수 있습니다.

728x90

'C++' 카테고리의 다른 글

[C++] 숨겨진 친구(hidden friend)  (2) 2024.11.13
[C++] 친구(friends) 함수  (2) 2024.11.12
[C++] 람다 함수의 클로저 타입  (0) 2024.11.10
[C++] 람다(lambda) 함수  (0) 2024.11.09
[C++] maybe_unused  (1) 2024.11.08