본문 바로가기
  • 쓸쓸한 개발자의 공부방
C++

[C++] 함수 : constexpr function

by 심찬 2021. 8. 10.

 

 

constexpr function

https://en.cppreference.com/w/cpp/keyword/constexpr

 

constexpr 상수

   constexpr int c = 1;

 

constexpr function : 함수 앞에 constexpr 이 있는 형태

  -  컴파일 할 때 값을 결정할 수 있으면, 컴파일 할 때 함수를 바로 실행한다.
  -  함수 인자값을 컴파일 시간에 결정할 수 없으면, 실행시간에 함수를 실행한다.

constexpr int add(int a, int b)
{
    return a + b;
}

int main()
{
    int x = 1;
    int y = 1;
    
    int n1 = add(1, 1);   // 컴파일 할 때 값을 결정할 수 있으면, 컴파일 할 때 함수를 바로 실행함.
    int n2 = add(x, y);   // 함수 인자값을 컴파일 시간에 결정할 수 없으면 실행시간에 함수를 실행.
}

 

 

템플릿과 constexpr 함수를 함께 사용하는 경우의 예제:

template<typename T, int N>
struct Buffer
{
    T data[N];
};
constexpr int add(int a, int b)
{
    return a + b;
}
int main()
{
    int x = 1;
    int y = 1;
    
    int n1 = add(1, 1);
    int n2 = add(x, y);
    
    Buffer<int, 1024> b1;
    Buffer<int, x> b2;        // error : x가 변수이기 때문에 컴파일에서 알수가 없어서 에러발생
    Buffer<int, add(1,2)> b3; // ok    : 컴파일 단계에서 값(3)을 알기 때문에 문제 없음.
    Buffer<int, add(x,2)> b4; // error : 컴파일 단계에서 알 수 없어 에러 발생
}

main.cpp:19:18: error: the value of ‘x’ is not usable in a constant expression

 

constexpr function의 제약 조건

 

C++11에서는 리턴 문장이 하나만 있어야 한다.

C++14 일부 제약이 남아 있다.

  - 파일을 오픈하거나 동적 메모리 할당이 불가하다.

  - 가상함수가 될 수 없다.

#include <iostream>

constexpr int factorial(int n )
{
    // 이 곳에 파일 오픈, 동적 메모리 할당이 불가하다.

    // return 이 2개가 있을 때 c++11에서는 에러가 발생힌다.
    if ( n == 1 ) 
        return 1;
    return n * factorial( n-1 );
}

int main()
{
    int n = factorial(5);

    std::cout << n << std::endl;
}

main.cpp:11:1: error: body of constexpr function ‘constexpr int factorial(int)’ not a return-statement

 

좀 더 자세한 constexpr function 의 제약조건은 cppreference 사이트에서 확인해 볼 수 있습니다. (상당히 많네요...)

 

 

 

 

댓글