const vs constexpr
개요
이 문서에서는 C++의 const
와 constexpr
키워드를 비교하고, 각각의 특징과 사용 사례를 정리합니다.
C++ 버전별 도입 시기
- C++98: const
- C++11: constexpr 도입
- C++14, 17, 20: constexpr 기능 확장
const
vs constexpr
구분 | const |
constexpr |
---|---|---|
의미 | 읽기 전용 상수 | 컴파일 타임 상수 |
연산 시기 | 런타임 또는 컴파일 타임 (환경에 따라 다름) | 컴파일 타임에 반드시 계산 |
사용 제한 | 모든 변수에 적용 가능 | 함수, 변수, 객체 생성자 등 다양한 곳에 적용 가능 |
최적화 힌트 | 컴파일러가 최적화에 활용하지만 보장되지 않음 | 컴파일러가 반드시 상수 표현식으로 취급하여 최적화 |
예제 코드
#include <iostream>
// const: 런타임에 읽기 전용 변수
// constexpr: 컴파일 타임에 계산되는 상수 표현식
constexpr std::uint64_t faculty(const std::uint8_t n)
{
auto result = std::uint64_t{1};
for (std::uint8_t i = 1; i <= n; i++)
{
result *= i;
}
return result;
}
int main()
{
const auto value1 = faculty(5); // 런타임에 계산
constexpr auto value2 = faculty(5); // 컴파일 타임에 계산
std::cout << "value1 = " << value1 << "\n";
std::cout << "value2 = " << value2 << "\n";
return 0;
}
활용 팁
컴파일 타임 상수가 필요한 경우 (배열 크기, 템플릿 인자, static_assert 등) 반드시 constexpr 사용
단순한 읽기 전용 변수는 const로 충분
복잡한 상수 표현식을 작성할 때는 constexpr 함수로 추상화
'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글
Modern C++ : type conversions (11, 14, 17, 20) (2) | 2025.08.05 |
---|---|
Modern C++ : designated initializers (20) (0) | 2025.08.04 |
Modern C++ : enum concepts (11, 20) (1) | 2025.08.03 |
Modern C++ : enum vs enum class (98, 11) (1) | 2025.08.02 |
Modern C++ 둘러보기 (4) | 2025.08.01 |