반응형
constexpr
컴파일 시에 값 평가를 강제하기 위해서 템플릿 메타프로그래밍을 남용하였습니다. 이러지 않아도 컴파일러가 자발적으로 그렇게 해주는 경우도 있긴하였습니다. constexpr가 프로그래머의 의도를 보여주는 더 좋은 방법이라 할 수 있습니다.컴파일 도중에 값을 평가하는 것을 컴파일러에게 알려줍니다. 컴파일러가 컴파일 도중에 변수들을 결정지어 줍니다. 함수는 최대한 노력을 합니다.
constexpr int Factorial ( int n){
return n = 1 ? 1 : n * Factorial(n -1);
}
int main ()
{
int value = 3;
int result1 = Factorial(value);
constexpr int result2 = Factorial(value); //컴파일 에러
constexpr int result3 = Factorial(3);
}
컴파일 도중에 반드시 값을 결정되게 하려면 constexpr 변수를 쓰면 됩니다. 다만 그 값을 구하는 시간이 길어지면, 컴파일러가 거부할 수 도 있습니다. std::unorderd_map에서 해쉬 함수는 각 문자열마다 중복되지 않는 정수 값을 생성하려 합니다. 이 때 해쉬 충돌이 일어날 수도 있습니다. 코드가 문자열을 참조하는 경우 문자열을 비교해야 합니다.
문자열 비교에는 비용이 필요합니다. 비용을 절감하려면, 무잔열의 해쉬를 생성하고 그 후에 해쉬 값을 비교합니다. 문자열 해쉬를 컴파일 도중에 만들 수 있다면, 그럼 문자열 비교에 드는 런타임 비용은 언제나 O(1)이 됩니다. 즉, constexpr을 써서 컴파일 타임에 문자열 해쉬를 만들 수 있으므로 이러한 문제를 해결할 수 있습니다.
const
변경을 불허하기 위함이다. 멤버 함수에만 사용 가능하며, 멤버 변수를 바꿀 수 없습니다.
constexpr
컴파일 시 평가를 하기를 위함이다. 멤버와 비멤버 함수에 둘다 사용가능합니다. C++14부터는 멤버 변수를 바꿀 수 있습니다.
반응형
'SW > C++' 카테고리의 다른 글
C++ : 람다식 : 장점, 단점, 배스트 프랙티스, 예제, 구현 (0) | 2020.04.29 |
---|---|
C++ : 람다식 : 개념, 예제, 구성, 방법, 활용법 (0) | 2020.04.28 |
C++ : 이동대입연산자 : 개념, 예제, 활용방법 (0) | 2020.04.26 |
C++ : lvalue, rvalue, move, 이동생성자 : 개념, 장점, 필요성 (0) | 2020.04.25 |
C++ : 템플릿 : 특수화, 장점과 단점, 베스트 프랙티스 (0) | 2020.04.24 |