콘텐츠로 이동

C++20 consteval — 즉시 함수(Immediate Function)

consteval은 C++20에서 도입된 즉시 함수(immediate function) 선언 키워드입니다. constexpr 함수는 런타임에도 호출될 수 있지만, consteval 함수는 반드시 컴파일 타임에만 호출됩니다. 런타임 호출 시도는 컴파일 오류가 됩니다.


#include <cstdint>
// constexpr: 런타임·컴파일 타임 모두 가능
constexpr int square_cx(int x) { return x * x; }
// consteval: 컴파일 타임 전용
consteval int square_ce(int x) { return x * x; }
int main() {
constexpr int a = square_cx(5); // OK — 컴파일 타임
int b = square_cx(5); // OK — 런타임도 가능
constexpr int c = square_ce(5); // OK — 컴파일 타임
// int d = square_ce(5); // ERROR: 런타임 호출 불가
}

2. 기본 활용: 컴파일 타임 테이블 생성

섹션 제목: “2. 기본 활용: 컴파일 타임 테이블 생성”
#include <array>
#include <cstddef>
consteval std::array<int, 10> make_squares() {
std::array<int, 10> arr{};
for (std::size_t i = 0; i < 10; ++i)
arr[i] = static_cast<int>(i * i);
return arr;
}
// 바이너리에 상수 배열이 직접 삽입됨
inline constexpr auto squares = make_squares();

3. consteval if — 조건부 컴파일 타임 분기

섹션 제목: “3. consteval if — 조건부 컴파일 타임 분기”

C++23에서 도입된 if consteval을 사용하면 함수 내에서 컴파일 타임 여부를 분기할 수 있습니다.

#include <cmath>
constexpr double my_sqrt(double x) {
if consteval {
// 컴파일 타임 경로 (단순 뉴턴법)
double r = x;
for (int i = 0; i < 64; ++i)
r = (r + x / r) / 2.0;
return r;
} else {
// 런타임 경로 (하드웨어 sqrt 사용)
return std::sqrt(x);
}
}

consteval void validate_buffer_size(std::size_t size) {
if (size == 0 || (size & (size - 1)) != 0)
throw "Buffer size must be a non-zero power of 2";
}
template<std::size_t N>
struct Buffer {
consteval Buffer() { validate_buffer_size(N); }
int data[N];
};
// Buffer<128> ok; // OK
// Buffer<100> err; // 컴파일 오류: "Buffer size must be a non-zero power of 2"

struct Color {
uint8_t r, g, b, a;
consteval Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255)
: r(r), g(g), b(b), a(a) {}
};
// 모든 Color 리터럴은 컴파일 타임에 검증됨
constexpr Color red = Color(255, 0, 0);
constexpr Color white = Color(255, 255, 255);

항목내용
런타임 호출항상 컴파일 오류
가상 함수consteval virtual 불가
함수 포인터consteval 함수를 가리키는 함수 포인터 생성 불가
예외 던지기컴파일 타임 오류 메시지로 활용 가능

consteval은 컴파일 타임 계산이 반드시 보장되어야 하는 상황에 사용합니다. 상수 테이블 생성, 입력 검증 강제, 설정 값 정책 확인 등에서 constexpr보다 강력한 안전망을 제공합니다.