const vs constexpr vs inline 비교표
1. 기본 개념 및 목적
키워드 |
목적 |
의미 |
도입 버전 |
const |
불변성 보장 |
"이 값은 변경될 수 없다" |
C++98 |
constexpr |
컴파일 타임 계산 |
"이 값/함수는 컴파일 타임에 평가될 수 있다" |
C++11 |
inline |
성능 최적화 |
"이 함수를 호출 지점에 직접 삽입하라" |
C++98 |
2. 적용 대상
적용 대상 |
const |
constexpr |
inline |
변수 |
✅ 가능 |
✅ 가능 |
✅ 가능 (C++17부터) |
함수 |
❌ 불가능 |
✅ 가능 |
✅ 가능 |
멤버 함수 |
✅ 가능 |
✅ 가능 |
✅ 가능 |
포인터 |
✅ 가능 |
✅ 가능 |
❌ 불가능 |
참조 |
✅ 가능 |
✅ 가능 |
❌ 불가능 |
3. 변수에서의 특징
특징 |
const |
constexpr |
inline |
초기화 시점 |
런타임/컴파일타임 |
컴파일타임 필수 |
런타임/컴파일타임 |
값 변경 |
불가능 |
불가능 |
가능 (일반 변수처럼) |
메모리 할당 |
런타임에 메모리 할당 |
컴파일러 최적화로 제거 가능 |
ODR 문제 해결 |
배열 크기 |
때때로 가능 |
✅ 항상 가능 |
❌ 불가능 |
// 예시
const int a = 10; // 런타임 초기화 가능
constexpr int b = 20; // 컴파일타임 초기화 필수
inline int c = 30; // C++17, 헤더에 정의 가능
int arr1[a]; // 컴파일러에 따라 가능/불가능
int arr2[b]; // 항상 가능
// int arr3[c]; // 불가능
4. 함수에서의 특징
특징 |
const (멤버함수) |
constexpr |
inline |
평가 시점 |
런타임 |
컴파일타임 가능 |
런타임 (호출 지점 삽입) |
객체 상태 변경 |
불가능 |
불가능 (constexpr 멤버함수) |
가능 |
재귀 호출 |
가능 |
제한적 가능 |
일반적으로 인라인 안됨 |
가상 함수 |
가능 |
❌ 불가능 |
제한적 (런타임 바인딩 필요) |
템플릿 |
가능 |
가능 |
자동으로 인라인 경향 |
class Example {
int value = 0;
public:
// const 멤버 함수
int getValue() const { return value; }
// constexpr 함수 (C++11)
constexpr int square(int x) const { return x * x; }
// inline 함수
inline void setValue(int v) { value = v; }
};
5. 컴파일러 처리 방식
처리 방식 |
const |
constexpr |
inline |
컴파일타임 최적화 |
부분적 |
강력함 |
함수 호출 최적화 |
런타임 성능 |
보통 |
매우 좋음 |
좋음 (호출 오버헤드 제거) |
코드 크기 |
변화 없음 |
감소 가능 |
증가 가능 |
컴파일러 강제성 |
강제 (불변성) |
강제 (컴파일타임 평가) |
힌트 (무시 가능) |
6. 조합 사용
조합 |
가능 여부 |
의미 |
예시 |
const constexpr |
✅ 가능 |
컴파일타임 상수 (중복이지만 명확성) |
const constexpr int SIZE = 100; |
inline constexpr |
✅ 가능 |
컴파일타임 평가 + 인라인 (암시적) |
inline constexpr int func() { return 42; } |
const inline |
✅ 가능 (C++17) |
불변 인라인 변수 |
const inline int VAL = 10; |
const constexpr inline |
✅ 가능 |
모든 특성 조합 |
const constexpr inline int ALL = 5; |
7. 사용 시나리오
시나리오 |
권장 키워드 |
이유 |
설정 상수 |
constexpr |
컴파일타임 최적화 |
함수 매개변수 |
const |
의도 명확화 |
작은 유틸리티 함수 |
inline 또는 constexpr |
성능 최적화 |
클래스 멤버 상수 |
static constexpr |
메모리 효율성 |
헤더 파일 변수 |
inline (C++17) |
ODR 문제 해결 |
수학 함수 |
constexpr |
컴파일타임 계산 |
Getter/Setter |
const (getter), inline (둘다) |
의도와 성능 |
ODR stands for the One Definition Rule.
This fundamental rule dictates that certain entities in a C++ program can only have one definition throughout the entire program. Violating the ODR leads to undefined behavior, meaning the program's execution cannot be predicted.
8. 제한사항 및 주의사항
제한사항 |
const |
constexpr |
inline |
동적 할당 |
포인터는 const 가능 |
❌ 불가능 |
해당 없음 |
런타임 값 |
✅ 가능 |
❌ 불가능 |
✅ 가능 |
복잡한 연산 |
✅ 가능 |
제한적 |
컴파일러가 판단 |
가상 함수 |
✅ 가능 |
❌ 불가능 |
제한적 효과 |
예외 처리 |
✅ 가능 |
제한적 (C++14부터 완화) |
✅ 가능 |