본문 바로가기
프로그래밍/C++

C++ ] constexpr

by eteo 2025. 11. 30.
반응형

 

 

 

constexpr

 

constexpr은 C++11에서 추가된 키워드로, 변수나 함수를 컴파일 타임에 값이 결정되는 상수로 만들도록 컴파일러에게 지시하는 역할을 한다. 이를 통해 컴파일러는 미리 값을 계산하여 최적화된 코드를 생성하고, 런타임 성능을 향상시킬 수 있다.

 

 

 

 

 

constexpr를 변수에 사용하는 경우

 

constexpr을 변수 선언에 사용하면 그 변수는 컴파일 타임에 값이 결정되는 상수로 취급된다. 상수이기 때문에 배열 크기로도 사용이 가능하다.

 

// 전역 기준
constexpr int SIZE = 10;
int arr[SIZE]; // C++에서 가능

const int SIZE = 10;
int arr[SIZE]; // C++에서 가능, C에서는 오류

 

 

 

const 키워드와 유사해 보일 수 있지만, const는 값이 한 번 확정되면 바꿀 수 없다는 제약만 있을 뿐 런타임에 초기화하는 것도 가능하다. 반면, constexpr 변수는 값 확정이 반드시 컴파일 타임에 이루어져야 한다는 제약이 있다.

 

int add(int a, int b) {
    return a + b;
}

const int x = add(2, 3);	// 가능, const는 런타임 초기화 허용
constexpr int y = add(2, 3);	// 오류, constexpr 변수는 상수 표현식 필요

 

 

 

 

 

 

함수에 사용하는 경우

 

constexpr을 함수 선언에 사용하면, 입력이 전부 컴파일 타임 상수이고 함수 본문이 모두 컴파일 시점에 평가 가능한 연산으로 이루어져 있는 경우 컴파일 시점에 결과를 미리 계산할 수 있다.

또한 constexpr 함수는 이런 컴파일 타임 계산에만 한정되어 사용되지 않고, 입력이 런타임 값인 경우에 일반 함수처럼 호출될 수 있다.

 

constexpr int add_constexpr(int a, int b) {
    return a + b; // 컴파일 시점에도 평가 가능
}

constexpr int x = add_constexpr(2, 3); // 컴파일 타임 초기화되어 상수로 취급됨

int foo(int a, int b) {
	return add_constexpr(a, b);	// 런타임에도 사용 가능
}

 

 

 

 

 

 

 

주요 사용 예시

 

constexpr 함수와 변수를 함께 사용하면, 복잡한 계산식도 컴파일 시점에 상수로 초기화할 수 있다. 이러한 방식은 배열 크기, 주소 계산, 상수 테이블 생성 등 여러 상황에서 유용하며, 단순히 문자열을 치환하는 #define 전처리문보다 타입 안정성 면에서 우수하다.

 

#include <cstdint>
constexpr uint32_t GPIO_BASE = 0x40021000;

constexpr uint32_t reg_addr(uint32_t base, uint32_t offset) {
    return base + offset;
}

constexpr uint32_t GPIO_MODER_ADDR = reg_addr(GPIO_BASE, 0x00);
constexpr uint32_t GPIO_ODR_ADDR   = reg_addr(GPIO_BASE, 0x14);

 

 

 

 

 

반응형