constexpr는 컴파일 시간에 값을 계산하도록 보장하는 키워드이다.
이는 컴파일러가 상수를 미리 계산할 수 있게 하여 더 최적화된 코드를 생성하도록 돕는다.
이를 사용하면 코드의 명확성과 효율성을 동시에 높일 수 있다.
주요 특징
- 컴파일 타임 상수로 사용
- constexpr로 선언된 변수는 컴파일 타임에 값이 확정되어야 한다.
- 이는 코드 실행 중에 계산되지 않고 컴파일 시점에 이미 결정된다.
- 함수에서 사용 가능
- constexpr 함수는 컴파일 타임에 계산할 수 있는 식을 처리할 때 사용된다.
- 컴파일 타임뿐만 아니라 런타임에서도 호출될 수 있다(단, 입력이 런타임 값일 경우).
- C++11부터 도입
- 초기에는 제한이 많았지만, C++14 이후로 기능이 확장되어 더 유연하게 사용 가능하다.
1. constexpr 변수
constexpr 변수는 컴파일 타임 상수로 값을 변경할 수 없다.
constexpr는 const보다 엄격한 상수 개념이다.
constexpr int x = 10; // 컴파일 타임에 결정
constexpr int y = x + 5; // 컴파일 타임에 계산됨
- 주의점: constexpr 변수는 반드시 컴파일 타임에 계산 가능한 값으로 초기화해야 한다.
2. constexpr 함수
constexpr 함수는 컴파일 타임에 실행 가능한 함수이다.
constexpr int add(int a, int b) {
return a + b;
}
int main() {
constexpr int result = add(3, 4); // 컴파일 타임에 계산
int x = 10;
int runtimeResult = add(x, 5); // ※런타임에 계산※
return 0;
}
특징:
- 입력 값이 모두 컴파일 타임 상수라면 컴파일 타임에 계산됨.
- 입력 값이 런타임 값이라면 런타임에 실행됨.
constexpr와 const의 차이
특징 | constexpr | const |
초기화 값 제한 | 컴파일 타임 상수로만 초기화 가능 | 런타임 값으로도 초기화 가능 |
값이 결정되는 시점 | 반드시 컴파일 타임에 결정 | 컴파일 타임 또는 런타임 가능 |
함수 정의 가능 여부 | 컴파일 타임 계산이 가능한 함수 정의 가능 | 함수 정의 불가 |
템플릿 인수로 사용 가능 여부 | 템플릿 인수로 사용 가능 | 템플릿 인수로 사용 불가능 |
사용 목적 | 컴파일 타임 상수 계산과 최적화 | 런타임 상수와 읽기 전용 값 선언 |
C++14 이후의 개선
더 복잡한 constexpr 함수
- C++14부터는 if, for 같은 제어문도 사용 가능해졌다.
- 이를 통해 더 유연한 함수 작성이 가능하다.
constexpr int factorial(int n) {
int result = 1;
for (int i = 1; i <= n; ++i) {
result *= i;
}
return result;
}
변수 선언
- constexpr 함수는 컴파일 타임 상수뿐 아니라 런타임 변수와도 함께 사용할 수 있다.
사용 예시
1. 컴파일 타임 상수 계산
constexpr를 사용하여 복잡한 상수 값을 계산한다.
constexpr int square(int x) {
return x * x;
}
constexpr int value = square(5); // 컴파일 타임에 계산됨
2. 템플릿에서 활용
템플릿 인수로 constexpr 값을 전달할 때 사용한다.
template <int N>
struct Array {
int data[N];
};
constexpr int size = 10;
Array<size> arr; // 크기가 10인 배열
3. 배열 크기 결정
컴파일 시점에 배열의 크기를 결정할 수 있다.
constexpr int getArraySize() {
return 5;
}
int arr[getArraySize()]; // 크기가 5인 배열
'프로그래밍 > C++' 카테고리의 다른 글
[C++] Operator new, malloc, memset 에 대해 (0) | 2025.01.15 |
---|---|
[C++] static에 대해서 (0) | 2024.12.27 |