728x90
constexpr는 C++11에서 도입된 키워드로, 컴파일 타임에 상수를 계산할 수 있도록 합니다. 이를 통해 런타임 비용을 줄이고, 코드의 안정성과 최적화를 향상시킬 수 있습니다.
주요 특징
- 컴파일 타임 계산
- constexpr 함수와 변수는 가능한 경우 컴파일 타임에 계산됩니다.
- 런타임에서 호출될 수도 있지만, 계산 가능 여부는 입력 값에 따라 결정됩니다.
- 상수 표현식
- constexpr 변수는 반드시 상수 표현식으로 초기화되어야 합니다.
- 컴파일 타임에 상수로 사용될 수 있습니다.
constexpr int a = 10; // 컴파일 타임 상수
constexpr int b = a + 5; // 컴파일 타임에 15로 계산
함수의 제한 사항
- C++11: 함수 본문은 단일 return 문으로만 작성 가능.
- C++14: 조건문(if), 반복문(for, while) 등 복잡한 로직 허용.
constexpr int max(int a, int b) {
return (a > b) ? a : b; // C++11 가능
}
constexpr int sum(int n) { // C++14부터 가능
int result = 0;
for (int i = 1; i <= n; ++i)
result += i;
return result;
}
컴파일 타임 상수로만 동작하지는 않음
- 입력 값이 런타임 값이면, 런타임에서 실행됩니다.
constexpr int square(int x) {
return x * x;
}
int runtime_input = 7;
int runtime_result = square(runtime_input); // 런타임 계산
사용 예시
변수 초기화
constexpr int length = 10;
constexpr int width = 20;
constexpr int area = length * width; // 컴파일 타임에 계산
함수 활용
constexpr int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
constexpr int result = factorial(5); // 컴파일 타임에 120으로 계산
배열 크기
constexpr를 사용하여 배열 크기를 지정할 수 있습니다.
constexpr int size = 5;
int arr[size]; // 배열 크기 컴파일 타임에 결정
C++14 이후 확장
- 더 복잡한 로직 지원
C++14부터 반복문, 지역 변수 선언 등이 가능해져 유연성이 대폭 증가했습니다. - C++20: 동적 메모리 할당 및 예외 처리 가능
C++20에서는 constexpr 함수 내에서 new, delete, 예외 처리 등을 사용할 수 있습니다.
활용 예시
템플릿 메타 프로그래밍
constexpr는 템플릿 메타 프로그래밍에서 상수 계산에 자주 사용됩니다.
template<int N>
struct Factorial {
static constexpr int value = N * Factorial<N - 1>::value;
};
template<>
struct Factorial<0> {
static constexpr int value = 1;
};
constexpr int fact_5 = Factorial<5>::value; // 120
코드 최적화
컴파일 타임에 복잡한 계산을 미리 수행해 런타임 비용을 줄입니다.
constexpr int pow(int base, int exp) {
return (exp == 0) ? 1 : base * pow(base, exp - 1);
}
constexpr int result = pow(2, 10); // 1024 계산
요약
- 컴파일 타임 최적화: 복잡한 계산을 미리 수행하여 성능 향상.
- 코드 안정성: 컴파일 타임에 오류를 발견하여 디버깅 시간 단축.
- 유연성 증가: C++14 이후 다양한 로직을 표현 가능.
constexpr는 현대 C++ 프로그래밍에서 필수적인 도구로 자리 잡았으며, 특히 고성능 애플리케이션이나 템플릿 메타 프로그래밍에서 자주 사용됩니다.
728x90
'C++' 카테고리의 다른 글
[C++] type-specifier-seq / 타입 지정자 시퀀스란? (0) | 2025.04.19 |
---|---|
[C++]init-statementopt condition의 개념과 활용 (0) | 2025.02.03 |
[C++] front 함수 (0) | 2024.11.26 |
[C++] 클래스 템플릿의 부분 특수화(partial specialization)와 명시적 특수화(explict specialization) (0) | 2024.11.25 |
[C++] using키워드 (0) | 2024.11.24 |