21. C++ const, constexpr

C++ const, constexpr

1. 개요

1.1 문서 개요

이 문서는 C++에서 상수 표현을 위한 키워드 constconstexpr에 대해 설명합니다. 이 두 키워드는 프로그램 내 값의 불변성을 보장하며, 컴파일 타임 상수와 관련된 최적화, 오류 방지 및 표현력 향상에 중요한 역할을 합니다. 특히 C++11 이후 constexpr의 도입은 컴파일 타임 계산 기능을 확장하여 정적 프로그래밍을 가능하게 합니다.

2. 내용

2.1 const 키워드

2.1.1 개념 및 사용 목적

const는 변수 또는 객체가 초기화된 이후 변경될 수 없음을 의미합니다. 포인터, 함수 매개변수, 클래스 멤버 함수 등 다양한 문맥에서 사용됩니다.

const int a = 10;      // 상수 변수

2.1.2 const 포인터 구문

int x = 5, y = 10;
const int* p1 = &x;   // 포인터가 가리키는 값은 변경 불가
int* const p2 = &x;   // 포인터 자체는 변경 불가
const int* const p3 = &x;  // 둘 다 변경 불가

2.1.3 const 함수 인자와 반환값

void func(const std::string& s);   // 인자 변경 불가
const std::string& get();          // 반환된 문자열 변경 불가

2.1.4 const 멤버 함수

멤버 함수에 const를 붙이면 해당 함수는 객체의 멤버를 변경하지 않음을 보장합니다.

class A {
public:
    int get() const;  // 멤버 변수 수정 불가
};

2.2 constexpr 키워드

2.2.1 개념 및 배경

constexpr은 컴파일 타임에 평가될 수 있는 상수 표현을 정의하는 키워드로, C++11에서 도입되었습니다. 이후 C++14부터는 제약이 완화되어 더 복잡한 표현도 가능해졌습니다.

constexpr int square(int x) {
    return x * x;
}

constexpr int val = square(5);  // 컴파일 타임 평가

2.2.2 constexpr 변수

컴파일 타임 상수를 선언할 수 있습니다.

constexpr int SIZE = 100;

2.2.3 constexpr 함수 조건

  • 반환값이 constexpr 가능해야 함
  • 인자 및 연산이 모두 컴파일 타임 가능해야 함 (C++14 이전)
  • 함수는 단일 return 문으로 표현 가능해야 함 (C++11 기준)

2.2.4 C++14 이후 변화

C++14부터는 constexpr 함수 내부에 if, for, 변수 선언 등 다양한 표현이 허용됩니다.

constexpr int factorial(int n) {
    int result = 1;
    for (int i = 2; i <= n; ++i)
        result *= i;
    return result;
}

2.3 const vs constexpr 비교

항목 const constexpr
평가 시점 런타임 또는 컴파일 타임 반드시 컴파일 타임
불변성 값의 변경 불가 컴파일 타임 상수
함수 적용 불가능 가능
복잡한 표현 허용 불가 C++14부터 가능

3. 마무리

const는 불변성을 의미하며 다양한 문맥에서 사용되어 코드 안정성과 의도를 명확히 합니다. 반면 constexpr은 컴파일 타임 상수를 정의하며, 프로그램의 정적 분석 및 최적화에 기여합니다. 두 키워드는 각기 다른 목적과 의미를 가지며, 적절히 구분하여 사용하는 것이 중요합니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

error: Content is protected !!
위로 스크롤