<개인공부>/[C++]

[C++] constexpr 상수

BlockDMask 2021. 2. 11. 00:30
반응형

안녕하세요. BlockDMask 입니다.
오늘은 C++11 부터 나온 contexpr 이라는 것에 대해서 알아보려고 합니다.

const 와 비슷하게 상수를 만들어 주는 또 다른 키워드 constexpr 이 무엇인지 한번 알아보겠습니다.

 

C++ const, constexpr


(constexpr 은 C++11에 처음 나왔으며 C++14 에서 개선됨 어짜피 현재는 2021년이기 때문에 C++11이든 14이든 예전에 생긴 문법입니다.)

constexpr 이란.
컴파일 시간 상수를 만드는 키워드
컴파일 시간에 결정되는 상수 값으로만 초기화 할 수 있다.

 

constexpr이 변수를 상수로 만들어 준다고 하는데 그럼 const와 똑같은데 무슨 차이가 있나요?
라고 질문 하실 수 있는데, 좀 더 상세하게 상수에 대해서 알아볼게요.

상수에는 2가지 상수가 존재합니다.
1. 컴파일 시간에 알 수 있는 상수.
2. 컴파일 시간에 알 수 없는 상수. (실행시간에 알 수 있는 실행시간 상수)

이렇게 두 종류의 상수가 존재합니다. 

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

 

const는 컴파일 시간에 알 수 있는 상수와 컴파일 시간에 알 수 없는 상수 둘다 사용할 수 있습니다.
반면 constexpr은 컴파일 시간에 알수 있는 컴파일 상수에서만 사용할 수 있죠.

const가 constexpr를 포함한다고 생각하시면되고
컴파일 상수에는 constexpr을 사용하고 그 외의 상수에는 const를 사용하면 될 듯 합니다.

컴파일 시간 상수와 런타임 상수를 간단하게 예시로 보여드리겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
 
int main(void) {
    int a = 10;
 
    const int num1 = 20;        //컴파일 시간 상수
    const int num2 = a;            //런타임 상수
 
 
    constexpr int num3 = 20;    //컴파일 시간 상수
    //constexpr int num4 = a;    // ERROR : 런타임 상수
 
    return 0;
}
 
cs

이렇게 명확하게 숫자로 변수를 지정하는 num1, num3은 컴파일 시간 상수이고,
변수에 변수값을 대입하여 상수로 만드려는 num2, num4는 런타임 상수 입니다.

constexpr은 컴파일 타임 상수에만 사용할 수 있으므로 num4에서 error가 발생하게 되는 것 입니다.

 

정리를 하자면

constexpr, const는 둘다 상수를 만들어주는 키워드이지만

const는 컴파일 시간, 실행시간 상수 모두 만들수 있고,

constexpr은 컴파일 시간 상수만 만들 수 있습니다.

 

 

그러므로 변수값으로 const를 사용할 것이 아니라면, 더 명확한 constexpr을 사용하는것을 추천드립니다.

반응형