안녕하세요. 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을 사용하는것을 추천드립니다.
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] 람다 표현식, lambda에 대해서 (5) | 2021.05.17 |
---|---|
[C++] 멤버 초기화 리스트 (member initializer lists) (0) | 2021.02.19 |
[C++] nullptr (널 포인터 리터럴) (3) | 2021.02.17 |
[C++] 디폴트 매개변수 (default parameter) (0) | 2021.02.15 |
[C++] 인라인 함수 (inline function) (1) | 2021.02.10 |
[C++] 2진수 8진수 16진수 표기법, 자릿수 표기법 (0) | 2021.02.09 |
[C++] std::setw, std::setfill, std::left, std::right (입출력 형태 지정2) (0) | 2021.02.05 |
[C++] 8진수, 10진수 16진수 출력 (입출력 형태 지정 1) (1) | 2021.02.04 |