C++

[C++] const static data member

코딩 메모장 2024. 11. 27. 23:01
728x90

constexpr는 C++11에서 도입된 키워드로, 컴파일 타임에 상수를 계산할 수 있도록 합니다. 이를 통해 런타임 비용을 줄이고, 코드의 안정성과 최적화를 향상시킬 수 있습니다.

 

주요 특징

  1. 컴파일 타임 계산
    • constexpr 함수와 변수는 가능한 경우 컴파일 타임에 계산됩니다.
    • 런타임에서 호출될 수도 있지만, 계산 가능 여부는 입력 값에 따라 결정됩니다.
  2. 상수 표현식
    • 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 이후 확장

  1. 더 복잡한 로직 지원
    C++14부터 반복문, 지역 변수 선언 등이 가능해져 유연성이 대폭 증가했습니다.
  2. 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