C++

noexcept & constexpr

Keisa 2023. 9. 28. 18:22

● noexcept 

1. 함수 인터페이스의 일부, 이는 호출자가 noexcept여부에 의존할 수 있음을 뜻한다

2. noexcept 함수는 비 noexcept함수보다 최적화의 여지가 크다

3. noexcept는 이동 연산들과 swap, 메모리 해제 함수들, 그리고 소멸자들에 특히 유용

4. 대부분의 함수는 noexcept가 아니라 예외에 중립

 

※ noexcept은 강한 예외 보장을 하는데 이동 연산시 예외 보장이 안될 경우 복사를 진행하므로 이동 연산의 이점을 제대로 활용하고자하면 이동 생성자에 예외보장(noexcept)을 선언해줘야한다.

 

● constexpr

1. constexpr 객체는 const이며, 컴파일 도중에 알려지는 값들로 초기화 된다 : 상수가 된다는 뜻

2. constexpr 함수는 그 값이 컴파일 도중에 알려지는 인수들로 호출하는 경우에는 컴파일 시점 결과를 산출

: 실행시점에 동작하는게 아니므로 컴파일 시점 때 산출한 결과를 통해 최적화를 진행

3. constexpr 객체나 함수는 비 constexpr객체나 함수보다 광범위한 문맥에서 사용가능

4. constexpr은 객체나 함수의 인터페이스의 일부

 

※ const와 constexpr의 주요차이점

const는 초기화를 런타임까지 지연시킬 수 있으나 constexpr변수는 반드시 컴파일 타임에 초기화가 되어 있어야한다

 

※ constexpr을 함수반환값에 사용할 때는 

1. 가상으로 재정의된 함수가 아니어야한다.

2. 반환값은 반드시 리터럴 타입이어야한다

 

※ 함수에 constexpr을 붙일 경우 inline을 암시

: 가능하다면 컴파일 타임에 실행을 요청하나 상황에 따라 런타임에 실행요청(inline 함수도 동일)

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

std::unique_ptr & std::shared_ptr & std::weak_ptr  (0) 2023.09.28
explicit & 특수 멤버 함수  (0) 2023.09.28
enum/enum class  (0) 2023.09.28
별칭 선언(using)  (0) 2023.09.28
auto & 중괄호 초기화 & nullptr  (0) 2023.09.28