: const 보다는 constexpr 키워드를 사용하자!!
결론
: const보다는 constexpr을 사용하자.
- constexpr vs constexpr의 차이를 분명히 알자.
: const 는 런타임, 컴파일 타임에 결정됨.
:: constexpr은 컴파일 타임에 결정됨.
배열의 크기는 컴파일 시간에 결정됨.
1) const 는 런타임 시간에 값을 결정
2) constexpr은 컴파일 시간에 값을 결정.
// 아래에 정의가 있음.
: 배열의 크기는 반드시 상수값만 들어와야 한다.
: 변하지 않는 값을 의미하는데, 있는 그대로 표현을 확인하면,
상수 = 변수 도 가능한 것이 const 변수이고,
상수 = 상수 만 가능한 것이 constexpr 임.
개념
: 컴파일 시간뿐만 아니라 런타입 시간에 상수의 값을 결정할 수 있음.
: 위의 내용을 토대로,
가) const 변수에 리터럴값을 넣어보고, (컴파일)
나) const 변수에 변수를 넣어보고, (런타임)
다) 배열의 크기에 가)와 나)로 처리한 변수를 각각 넣어보자.
-> 배열의 크기는 컴파일 시간에 결정되는 것이므로,
런타임에 처리되는 변수는 불가함.
개념
: 컴파일 시간에만 상수의 값을 결정함.
- template 과 constexpr 함수에 주로 사용.
가) constexpr 변수에 리터럴값을 넣은후, 배열의 크기에 넣어보자.
나) constexpr 변수에 변수명을 넣은 후, 배열의 크기에 넣어보자.
-> 15번줄을 보면, 변수를 넣을 수 없는 것을 확인할 수 있다.
-> 배열의 크기는 컴파일 시간에 결정되기 때문에 const는 넣을 수 없고(위에 확인함.) , constexpr 변수를 넣을 수 있다.
: const변수는 어쩔 때는 런타임값도 들어가지고, 배열에서는 왜 또 안되는 거야?
배열의 크기는 컴파일 시간에 결정된다. const 변수는 런타임, 컴파일 시간에 결정되는 특성이 있다.
하지만, constexpr은 컴파일 시간에만 값을 결정하므로,
컴파일러가 컴파일 타임 상수를 보장하므로, 최적화도 됨.