본문 바로가기

C++

const, constexpr, consteval에 대해

반응형

const

변경 불가능한 값을 표시할때 사용합니다. 인터페이스를 명시할 때 주로 사용되며, const의 값은 런타임 또는 컴파일 타임에 계산될 수 있습니다.

 

constexpr

컴파일 타임에 평가되는 컴파일 타임 상수를 정의할 때 사용됩니다.

상수를 명시하거나, 읽기 전용 메모리 내에 데이터를 넣을때 사용됩니다.

constexpr의 값은 컴파일러가 계산해야 합니다.

 

constexpr로 정의된 함수는 컴파일 타임 상수를 생성할때 사용할 수 있지만, 일반 함수처럼 사용도 가능합니다. 아래는 예시입니다.

#include <iostream>

constexpr int square(int x) {
    return x * x;
}

int main() {
    constexpr int compileTimeValue = square(5); // 컴파일 타임 계산
    std::cout << "Compile-time: " << compileTimeValue << std::endl;

    int runtimeInput;
    std::cin >> runtimeInput;
    int runtimeValue = square(runtimeInput); // 런타임 계산
    std::cout << "Run-time: " << runtimeValue << std::endl;

    return 0;
}

constexpr로 정의된 함수를 8번 라인에서는 constexpr int 타입의 상수를 선언할때 상수식으로 사용합니다.

하지만 13번 라인에서는 int 타입 변수인 runtimeValue의 값을 runtimeInput이라는 변수를 사용하여 초기화할때 constexpr 함수를 사용하고 있고, 이 경우에도 constexpr 함수는 에러를 발생시키지 않고 일반 함수처럼 런타임에서 값을 계산하도록 동작합니다.

 

이렇게 constexpr함수는 유연성을 제공하며, 결과적으로 같은 함수를 상수식/변수용으로 두번 정의하지 않아도 되도록 합니다.

 

consteval

C++20부터 사용 가능한 consteval은, 반드시 컴파일 타임에 평가되어야 하는 함수를 정의합니다.

런타임에서 호출을 시도하면 컴파일 오류가 발생하며, 이러한 특징때문에 상수식을 강제하기 위해 사용할 수 있습니다.

consteval double square2(double x) { return x*x; }

constexpr double max1 = 1.4*square2(18); //OK
const double max3 1.4*square2(var); //error : var는 상수가 아님.
double max4 = square2(18); //error : 런타임에서 호출 불가능

위의 예제처럼 상수가 아닌 값을 사용하거나, 변수를 초기화할때처럼 런타임에서 값을 계산하는 경우 consteval은 컴파일 오류를 발생시킵니다.

반응형