본문 바로가기
언어/C, C++

[C++] constexpr이란? const와 constexpr의 차이 ( const vs constexpr )

by minhyeok.lee 2024. 1. 8.
반응형

constexpr 이란?

1. 컴파일 시간 상수를 만드는 키워드

2. 컴파일 시간에 결정되는 상수 값으로만 초기화 할 수 있다.

3. constexpr 은 C++11에 처음 나왔으며 C++14 에서 개선된 기록이 있다.

 

C++에서 const와 constexpr의 차이 ( const vs constexpr )

상수에는 아래 2가지가 존재한다.

1. 컴파일 시간에 알 수 있는 상수

2. 컴파일 시간에 알 수 없는 상수(런타임에 알 수 있는 상수)

컴파일 시간에 알 수 있는 상수를 컴파일 시간 상수 (compile-time constant)라고 하고, 컴파일 시간에 알 수 없는 상수 즉 실행시간에 알 수 있는 상수를 런타임 상수(runtime constant)라고 한다.

const는 컴파일 시간에 알 수 있는 상수와 컴파일 시간에 알 수 없는 상수 둘다 사용할 수 있다.

반면 constexpr은 컴파일 시간에 알수 있는 컴파일 상수에서만 사용할 수 있다.

const가 constexpr를 포함한다고 생각하고 컴파일 상수에는 constexpr을 사용하고 그 외의 상수에는 const를 사용하자.

 

컴파일 시간 상수와 런타임 상수 예시

#include<iostream>
using namespace std;
 
int main(void) {
    int a = 1;
 
    const int example1 = 2;         //컴파일 시간 상수 (정상동작)
    const int example2 = a;         //런타임 상수 (정상동작)
 
 
    constexpr int example3 = 20;    //컴파일 시간 상수 (정상동작)
    constexpr int example4 = a;     // 런타임 상수 (ERROR)
 
    return 0;
}

 

예시에서 보면 example1, example3은 컴파일 시간 상수이고, 변수에 변수값을 대입하여 상수로 만드려는 example2, example4는 런타임 상수 이다.

constexpr은 컴파일 타임 상수에만 사용할 수 있으므로 example4에서 error가 발생한다. (컴파일 시점에 example4의 값을 알 수 없음)

 

정리

1. constexpr, const는 둘 다 상수를 의미한다.

2. const는 컴파일 시간, 실행시간 상수 모두 만들수 있고, constexpr은 컴파일 시간 상수만 만들 수 있다.

3. const만 사용하더라도 기능적으로 문제는 없지만 컴파일 상수에는 더 명확한 constexpr을 사용하는것을 추천한다.

반응형

'언어 > C, C++' 카테고리의 다른 글

[C, C++] 모든 타입 정리  (0) 2024.04.24

댓글