컴퓨터공학/C++

[C++] noexcept

Pyxis 2024. 11. 9. 18:42

[ C++ : noexcept ]

 

std::vector

 

vector에서 push_back()이 호출되었을 때, size와 capacity가 동일하다면

1.5배 증가된 capacity로 새롭게 reserve()를 하고, 기존 데이터들을 옮겨야 한다.

이 때, 복사를 하면 성능이 떨어질 수 있으므로 가능하면 이동을 한다.

하지만 컴파일러는 예외가 생길 수 있으므로, 이동 생성자가 아닌 복사 생성자를 호출할려고 한다. 이를 프로그래머가 막아주기 위해 명시적으로 noexcept 키워드를 붙여 예외가 발생하지 않는다고 힌트를 주게 한다.

 

여기서 예외는, try-catch에 걸리는 이론상 발생할 수 있는 수많은 예외를 말한다.

예를 들면, 동작할당 new를 할 때에도 극단적인 상황, 즉 메모리가 부족하다면 할당이 실패할 수도 있다.

또한 (int / int)를 할 때 divide by zero 예외가 발생할 수도 있다.

이를 catch-try를 통해 명시적으로 받아주지 않는다면 크래시가 날 수 있다.

그래서 성능을 위해 noexcept 키워드를 써서 크래시가 발생해도 괜찮다고 컴파일러에게 힌트를 주는 것. 

예외가 절대 발생하지 않는다고 가정하라는 힌트를 받은 컴파일러는, 예외를 확인하는 코드들을 추가하지 않아도 되므로 추가적인 최적화가 가능하다.

 

std::move() 내에서, 예외가 발생할까봐 

C++11에서, 소멸자들은 기본적으로 전부 noexcept이다. 절대로 예외를 던지면 안되기 때문이다.

 

 

 

 

[ Reference ]

https://www.inflearn.com/community/questions/146033/noexept-%ED%82%A4%EC%9B%8C%EB%93%9C%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%A7%88%EB%AC%B8%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4

 

https://learn.microsoft.com/ko-kr/cpp/cpp/noexcept-cpp?view=msvc-170