constexpr (C++11, C++14)
constexpr 키워드가 명시되어 있으면 변수 혹은 함수는 컴파일 타임에 결정되는 상수식으로 지정
됩니다.
constexpr 을 붙일 수 있는 타입은 literal-type 으로 한정되며,
literal-type 은 void, 스칼라 값 (숫자 1이나 0.1 같은), reference, constexpr 생성자를 가지는 클래스 등을 의미합니다.
constexpr 을 사용하면 Runtime 에 처리해야 할 코드가 줄어들기 때문에 성능 상 이득을 얻을 수 있는 경우가 있습니다.
#include <iostream>
constexpr int integer2 = 2;
constexpr int startNumber = integer2 + 1;
constexpr int Factorial(int n)
{
int result = n == 1 ? 1 : n * Factorial(n - 1); // C++14
return result;
}
int main(int argc, const char * argv[])
{
int arrayWithFactorial[Factorial(startNumber)];
printf("%d\n",Factorial(startNumber));
return 0;
}
6
constexpr 변수 (C++11)
- integer2는 constexpr 이 붙어 있으므로 int(스칼라) 값의 전역 상수식입니다.
- startNumber 는 integer2(상수식) + 1(스칼라,상수) = (상수식)으로, 컴파일 타임에 계산이 가능합니다.
- integer2 가 constexpr 이 아니라면, startNumber 에는 해당 값을 대입할 수 없습니다.
constexpr 함수 (C++11, C++14)
Factorial 함수는 constexpr 이 붙어있으므로 int 값을 리턴하는 상수식 함수입니다.
C++14 이상에서는, 함수 내에는 지역변수도 두는 것도 가능합니다.
- C++11 에서는 컴파일 에러가 발생합니다.
이 함수는 상수가 위치할 수 있는 어느 곳에서라도 호출할 수 있습니다.
예제 코드에서는 arrayWithFactorial 라는 배열을 선언하는데, 배열 크기로 Factorial(startNumber)를 호출했습니다.
- Factorial()이 constexpr 이 아닌 경우 컴파일 에러가 발생합니다.
constexpr 함수의 결과를 컴파일 타임 내에 결정할 수 없는 경우에는 상수 자리에는 위치할 수 없지만 일반적인 함수처럼 사용할 수 있습니다. 위 예제에서는 Factorial() 의 함수를 호출 할 때 constexpr 이 될 수 없는 값을 인수로 넣는 경우입니다.