SW/C++

C++ : constexpr : 개념, 예제, 사용법, 필요성, 장점

얇은생각 2020. 4. 27. 07:30
반응형

C++ : constexpr : 개념, 예제, 사용법, 필요성, 장점

 

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부터는 멤버 변수를 바꿀 수 있습니다. 

반응형