차근차근 꾸준히

한 눈에 알기 쉽게 정리하자

프로그래밍/C++

[C++] constexpr에 대해서

shintesh 2024. 12. 27. 19:44

constexpr는 컴파일 시간에 값을 계산하도록 보장하는 키워드이다.

이는 컴파일러가 상수를 미리 계산할 수 있게 하여 더 최적화된 코드를 생성하도록 돕는다.

이를 사용하면 코드의 명확성과 효율성을 동시에 높일 수 있다.


주요 특징

  1. 컴파일 타임 상수로 사용
    • constexpr로 선언된 변수는 컴파일 타임에 값이 확정되어야 한다.
    • 이는 코드 실행 중에 계산되지 않고 컴파일 시점에 이미 결정된다.
  2. 함수에서 사용 가능
    • constexpr 함수는 컴파일 타임에 계산할 수 있는 식을 처리할 때 사용된다.
    • 컴파일 타임뿐만 아니라 런타임에서도 호출될 수 있다(단, 입력이 런타임 값일 경우).
  3. 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