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부터 완화) ✅ 가능