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은 컴파일 오류를 발생시킵니다.
'C++' 카테고리의 다른 글
[C++]Linux - 스레드 동기화와 뮤텍스(Mutex) (1) | 2024.12.27 |
---|---|
널(null) 포인터 nullptr에 대해 (0) | 2024.12.23 |
C++의 구조체 멤버 맞춤(Structure member alignment), 클래스 (0) | 2024.12.18 |