Qaupot Blog
Software Engineering, Trip

109. constexpr / Cpp11,14

🕐 Thu, 18 Aug 2016 09:00:00 GMT 🕓 Wed, 25 Aug 2021 14:24:00 GMT

constexpr (C++11, C++14)

constexpr 키워드가 명시되어 있으면 변수 혹은 함수는 컴파일 타임에 결정되는 상수식으로 지정됩니다.

constexpr 을 붙일 수 있는 타입은 literal-type 으로 한정되며,
literal-type 은 void, 스칼라 값 (숫자 1이나 0.1 같은), reference, constexpr 생성자를 가지는 클래스 등을 의미합니다.

constexpr 을 사용하면 Runtime 에 처리해야 할 코드가 줄어들기 때문에 성능 상 이득을 얻을 수 있는 경우가 있습니다.

#include <iostream>

constexpr int integer2 = 2;
constexpr int startNumber = integer2 + 1;

constexpr int Factorial(int n)
{
    int result = n == 1 ? 1 : n * Factorial(n - 1); // C++14
    return result;
}

int main(int argc, const char * argv[])
{
    int arrayWithFactorial[Factorial(startNumber)];
    
    printf("%d\n",Factorial(startNumber));
    
    return 0;
}
6

constexpr 변수 (C++11)

  • integer2는 constexpr 이 붙어 있으므로 int(스칼라) 값의 전역 상수식입니다.
  • startNumber 는 integer2(상수식) + 1(스칼라,상수) = (상수식)으로, 컴파일 타임에 계산이 가능합니다.
  • integer2 가 constexpr 이 아니라면, startNumber 에는 해당 값을 대입할 수 없습니다.

constexpr 함수 (C++11, C++14)

Factorial 함수는 constexpr 이 붙어있으므로 int 값을 리턴하는 상수식 함수입니다.

C++14 이상에서는, 함수 내에는 지역변수도 두는 것도 가능합니다.

  • C++11 에서는 컴파일 에러가 발생합니다.

이 함수는 상수가 위치할 수 있는 어느 곳에서라도 호출할 수 있습니다.
예제 코드에서는 arrayWithFactorial 라는 배열을 선언하는데, 배열 크기로 Factorial(startNumber)를 호출했습니다.

  • Factorial()이 constexpr 이 아닌 경우 컴파일 에러가 발생합니다.

constexpr 함수의 결과를 컴파일 타임 내에 결정할 수 없는 경우에는 상수 자리에는 위치할 수 없지만 일반적인 함수처럼 사용할 수 있습니다. 위 예제에서는 Factorial() 의 함수를 호출 할 때 constexpr 이 될 수 없는 값을 인수로 넣는 경우입니다.

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.