[The C++ Programming Language에서 발췌]


    constexpr은 대략 '컴파일 타임에 평가될 예정'이라는 의미다. 이것은 주로 상수를 지정하는 데 사용되며, 데이터가 읽기 전용 메모리내에 저장되도록 해주고 성능을 높여준다. 다음의 예를 살펴보자.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    const int dmv = 17;                          // dmv는 이름을 가진 상수
    int var = 17;                                // var는 상수가 아니다.
    constexpr double max1 = 1.4 * square(dmv);   // square(17)이 상수 표현식인 경우 OK
    constexpr double max2 = 1.4 * square(var);   // 오류 : var는 상수 표현식이 아니다.
    const double max3 = 1.4 * square(var);       // OK, 런타임에 평가될 수 있다.
    double sum(const vector<double>&);           // sum은 자신의 인자를 수정하지 못할 것이다.
    vector<double> v { 1.23.44.5 };          // v는 상수가 아니다.
    const double s1 = sum(v);                    // OK, 런타임에 평가될 수 있다.
    constexpr double s2 = sum(v);                // 오류 : sum(v)는 상수 표현식이 아니다.
    cs


    함수가 상수 표현식, 즉 컴파일러에 의해 평가될 표현식 내에서 사용되려면 constexpr로 정의돼야 한다. 예를 들면 다음과 같다.


    1
    constexpr double square(double x) { return x * x; }
    cs


    constexpr이 되려면 함수는 상당히 간단해야 한다. 즉, 값을 계산하는 return문일 경우에만 가능하다. constexpr 함수는 상수가 아닌 인자에 대해 사용될 수도 있지만, 그런 경우의 결과는 상수 표현식이 아니다. constexpr 함수는 상수 표현식을 요구하지 않는 상황에서만 상수가 아닌 표현식 인자로 호출될 수 있으므로, 실질적으로 동일한 함수를 두번 정의할 필요는 없다. 한 번은 상수 표현식에 대한, 한 번은 변수에 대한 식으로 정의할 필요가 없다는 뜻이다.

    몇 가지 경우에는 언어 규칙에서 상수 표현식을 요구한다.(예를 들면 배열 경계, case 레이블, constexpr를 이용해서 선언된 상수). 어떠 경우에는 컴파일 타임 평가가 성능을 위해 필요하기도 하다. 성능 이유는 제쳐두고라도 불변성의 개념은 설계에서 중요한 고려 사항이다.


    [C++14부턴 constexpr 함수 내부 지역 변수와 연산이 존재해도 상관없음]

    Posted by Muramasa