기존에 상수를 선언하는 방법은 const 키워드를 사용하는 것이었다.
또는 #define 키워드를 활용하여 정의하였다.
하지만 constexpr 키워드가 C++11에 처음 소개되고 C++14에서 향상되었다.
const와 consetexpr 그리고 #define에 대해서 알아보고 차이점을 설명한다.
const - constexpr 공통점
- 두가지 키워드로 선언된 변수는 값을 변경할 수 없다.
const - constexpr 차이점
- const : 컴파일 타임 또는 런타임에 값이 정의되어야함
- constexpr : 컴파일 타임에 값이 정의되어 있어야 함
const kMY_MAX = 1000 // ok
const kMY_MIN = 100 // ok
void myFoo(int n)
{
const kMY_NUMBER = n + 1000; //ok
constexpr kMY_NUMBER2 = n + 100 //error
}
함수에 파라미터로 전달되는 값은 실행(런타임)에 결정된다.
constexpr의 경우 컴파일타임에 값이 확정되어야 하기 때문에 컴파일 에러가 발생한다.
constexpr의 사용
- 리터럴타입이어야 한다.
- 즉시 초기화되어야 한다.
- 컴파일 타임에 값이 확정되어야 한다.
- const 보다 좋은 성능을 발휘할 수 있다.(const가 런타임에 값이 결정될 경우)
#define 매크로와의 차이
- #define 매크로는 preprocessor에서 처리됨
- preprocessor는 C++ syntax를 이해하지 못함
- 매크로는 클래스, 함수 등의 범위가 정해져 있지 않고, 정의된 파일 또는 포함된 파일에서 사용가능하여 충돌이 발생할 수 있음
결론
#define매크로 보다 const와 constexpr을 최대한 활용한다.(안전)
컴파일타임에 값이 정해지는 경우 constexpr을 사용한다.
다음에는 const, constexpr 함수의 활용에 대한 내용을 학습해야 겠음
참고 사이트
https://stackoverflow.com/questions/42388077/constexpr-vs-macros
https://blog.naver.com/wjdeh313/222621831140
'기타 프로그래밍' 카테고리의 다른 글
[C++] 문자열의 거의 모든 것 (0) | 2022.05.12 |
---|---|
[C++] 표준 자료구조(컨테이너) vector, list, deque(queue) (0) | 2022.05.12 |
[C++] C++ Core Guidelines (C++ 핵심 가이드라인) - P.2, P.3 (0) | 2022.02.22 |
[C++] C++ Core Guidelines (C++ 핵심 가이드라인) - P.1 (0) | 2022.02.20 |
[C++] 배열의 call by reference (0) | 2022.01.10 |
댓글