C++ constexpr 키워드 정리
1. constexpr 키워드란?
constexpr 키워드는 C++11부터 도입된 키워드로, 컴파일 시간에 값을 결정할 수 있는 상수를 만들거나, 컴파일 타임에 실행될 수 있는 함수를 정의할 때 사용된다.
2. 기본 개념
constexpr은 “컴파일 타임 상수(constant expression)” 를 의미한다. 즉, 컴파일러가 프로그램을 빌드할 때 값을 계산해서 상수로 결정하도록 보장하는 것이다.
1
| constexpr int size = 10; // 컴파일 시간에 '10'으로 확정
|
위 코드에서 size는 컴파일 시점에 값이 결정되므로, 일반적인 const보다 더 강력한 상수 표현이다.
3. const와 constexpr의 차이
| 구분 | const | constexpr |
|---|
| 초점 | 값 변경 불가 | 컴파일 시간 상수 보장 |
| 값 결정 시점 | 실행 시간(런타임)일 수도 있음 | 컴파일 시간(빌드 타임) |
| 초기화 값 | 런타임 변수로도 초기화 가능 | 반드시 컴파일 타임 상수여야 함 |
| 함수에 적용 가능 | 불가 | 컴파일 타임에 실행될 수 있는 함수 작성 가능 |
예제 비교
1
2
3
4
5
6
| const int x = 10; // 런타임 상수일 수도 있음
constexpr int y = 10; // 컴파일 타임 상수
int n;
const int z = n; // 가능 (런타임 상수)
constexpr int w = n; // 컴파일 오류 (컴파일 타임에 결정 안됨)
|
4. constexpr 변수
(1) 컴파일 시간에 값이 결정되어야 함
1
2
3
| constexpr int size = 100; // O
int n = 100;
constexpr int size2 = n; // X, n은 런타임 변수이므로 오류
|
(2) 배열 크기 등에 활용
1
2
| constexpr int size = 5;
int arr[size]; // O, 컴파일 타임 상수라 배열 크기로 사용 가능
|
5. constexpr 함수
컴파일 시간에 결과가 결정될 수 있는 함수를 만들 때 사용된다.
(1) 선언 및 사용 예시
1
2
3
4
5
| constexpr int square(int x) {
return x * x;
}
constexpr int result = square(5); // 컴파일 타임에 계산됨
|
(2) 함수의 조건
- 함수 내의 모든 내용이 컴파일 타임에 평가될 수 있어야 함.
- 리턴값이 컴파일 타임 상수로 사용될 수 있어야 함.
(3) 런타임에도 호출 가능
constexpr 함수는 컴파일 타임뿐 아니라 런타임에서도 사용 가능하다.
1
2
3
| int n;
std::cin >> n;
int res = square(n); // 런타임 계산도 가능
|
6. constexpr과 const 함께 사용
1
| constexpr const int x = 10;
|
constexpr만 써도 사실상 const의 의미가 내포되어 있기 때문에 대부분의 경우 constexpr만 써도 충분하다.
7. 활용 예시
(1) 배열 크기, 상수 표현
1
2
| constexpr int arraySize = 10;
int arr[arraySize]; // 컴파일 타임에 배열 크기 확정
|
(2) 템플릿 인자
1
2
3
4
5
6
7
| template<int N>
struct Array {
int data[N];
};
constexpr int getSize() { return 5; }
Array<getSize()> arr; // 컴파일 타임에 결정됨
|
8. 주의사항
- 모든
constexpr 초기화 값은 반드시 상수 표현식이어야 한다. - 복잡한 함수도
constexpr로 만들 수 있지만, 조건문, 반복문 등은 C++14 이후부터 허용된다.
9. 요약 정리
| 용도 | 설명 |
|---|
| 변수 | 컴파일 타임 상수로 결정될 수 있는 값 설정 |
| 함수 | 컴파일 타임에 실행될 수 있는 함수 정의 |
| 배열 크기 | 배열 크기 등 컴파일 타임 상수 필요할 때 활용 |
| 템플릿 인자 | 컴파일 시점에 결정되어야 하는 값 전달 |
10. 결론
constexpr은 “이 변수, 함수의 결과를 컴파일 시간에 확정짓겠다”라는 의미이다. 컴파일 타임 상수가 필요할 때 적극 활용하면 코드 안전성과 최적화에 도움이 된다.