원어로는 'constant-expression'이며, 컴파일 타임에 평가되어 값이 결정되는 표현식을 의미합니다. 이를 통해 런타임 성능을 향상시키고, 코드에서 상수 값을 미리 계산하여 더 효율적으로 실행을 할 수 있게 됩니다.
constexpr로 선언된 변수는 컴파일 타임에 초기화되어야 하며, 그 값은 변경될 수 없습니다. 즉, 컴파일러가 코드 실행 전에 이미 값을 알고 있고, 이 값은 프로그램 실행 중에 변경될 수 없으므로, 성능 최적화에 큰 장점이 있습니다.
constexpr 변수 예시
constexpr int value1 = 100;
constexpr int value2; // Error : 초기화하지 않음.
constexpr로 선언된 함수는 컴파일 타임에 실행될 수 있는 함수로, 함수가 상수 표현식만 처리할 수 있도록 제한됩니다. 즉, 함수가 인자로 받는 값도 컴파일 타임 상수여야 하며, 함수 내부의 모든 계산도 컴파일 타임에 완료되어야 합니다.
constexpr 함수 사용 예시
#include <iostream>
using namespace std;
constexpr int square(int x) {
return x * x;
}
int main() {
constexpr int result1 = square(5);
int number = 5;
constexpr int result2 = square(number); // Error : 'number'는 런타임 값
int result3 = square(5); // 경고 : 결과는 컴파일 타임 상수이지만 일반 변수에 저장
return 0;
}
const와 constexpr은 둘 다 불변성을 나타내는 키워드이지만, 그 의도와 용도는 다릅니다.
const는 런타임 상수를 다루는 반면, constexpr는 컴파일 타임 상수를 다룹니다.
쉬운 예시
#include <iostream>
using namespace std;
int main() {
int variable1;
cin >> variable1;
int variable2 = 5;
const int constant1 = variable1;
const int constant2 = variable2;
constexpr int constExpr1 = variable1; // Error : 'variable1' 변수가 런타임에 결정
constexpr int constExpr2 = variable2; // Error : 'variable2' 변수가 컴파일 타임에 결정되어 있지 않음
constant1 = 5; // Error : 이미 값이 결정되어 변경이 불가능함
return 0;
}
즉, const의 경우는 1번 값이 결정되면 그때부터 값이 불변한다는 것이고,
constexpr는 실행 전부터 그 값이 결정되어있어야 함을 의미합니다.
constexpr로 선언된 변수나 함수는 컴파일 타임에 계산되므로, 컴파일러는 이 값을 미리 계산하여 실행 코드에 포함시킵니다. 즉, 프로그램 실행 시점에는 해당 값이 이미 결정되어 있기 때문에 실행 속도가 빨라집니다.