constexpr
템플릿 메타프로그래밍
컴파일 타임에 실행되는 프로그래밍 기법입니다. 이는 템플릿을 사용하여 코드를 생성하거나 변환함으로써 실행 시간이 아닌 컴파일 시간에 프로그램을 수정하고 확장하는 방법입니다. -> 아래와 같이 피보나치 수열의 값을 템플릿을 이용해 컴파일 타임에 값을 구할 수 있다.
왜 사용할까?
컴파일 도중에 값을 평가하기 위해서.
최적화 -> 그러나 가독성이 좋지 않다..
아래 예제는 컴파일 시 45 라는 값이 정해져 있어야 한다. -> 런타임에 피보나치 수열의 값을 받기 위해서는 런타임 용 함수를 만들어내야 한다. -> 코드 중복이 생겨난다..
결론적으로 템플릿 메타프로그래밍은 좋은 방법이 아니다!

constexpr
우리의 의도는 컴파일 도중에 값을 평가하는 것임을 컴파일러에게 알려줌
변수는 컴파일러가 컴파일 도중에 반드시 결정지어 줌
함수는 컴파일 도중에 결정지어주려 노력함 -> 평가할 수 없을 경우, 실행시에 그 함수가 호출된다.
constexpr 함수, 변수
constexpr 함수
constexpr 를 사용해 함수를 만들게 되면, 컴파일 타임에 값을 구할 수 있다면, 컴파일 타임에 동작하게 되고,
런타임에 값을 구할 수 있다면, 런타임에 동작하도록 한다. -> 템플릿 메타프로그래밍처럼 템플릿과 함수 두개를 만들 필요가 없다.

constexpr 변수
아래 예제 중 constexpr 의 매개변수가 상수가 아닌 경우, 컴파일 에러가 발생한다. -> constexpr 변수는 컴파일 중에 값이 평가되어야 하기 때문이다!
컴파일 도중에 '반드시' 값이 결정되게 하고 싶다면, constexpr 변수를 사용해라!

물론 과도한 연산의 경우, 컴파일 에러가 발생하기도 한다.

const vs constexpr (결국은 둘다 const)
const
변수와 함수 모두 변경이 불가하다..
멤버 함수에만 사용 가능하다. -> 멤버 변수를 바꿀 수 없다는 것을 의미한다.
constexpr
변수의 경우 컴파일 시 평가되어 변경이 불가하지만,
함수의 경우 컴파일 시 평가해주었으면 좋겠다는 것이지, 변경도 가능하다.
멤버 함수와 비멤버 함수에 둘 다 사용 가능하다. -> 멤버 변수를 바꿀 수 있다. ( C++14 부터)


Last updated