본문 바로가기
기타 프로그래밍

[C++] const vs constexpr | 상수 선언하기

by 나무꾼 2022. 5. 11.

기존에 상수를 선언하는 방법은 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

 

댓글