반응형
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);
반응형
'프로그래밍 > C++' 카테고리의 다른 글
| C++ ] 함수 템플릿, 클래스 템플릿 (0) | 2025.12.30 |
|---|---|
| C++ ] 싱글톤(Singleton) 클래스 (0) | 2025.12.15 |
| C++] fstream의 open mode (0) | 2025.07.24 |
| C++] Intel hex to bin 변환 프로그램 (TI C2000 시리즈) (0) | 2025.05.24 |
| C++] std::chrono 라이브러리 (0) | 2025.05.12 |