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 사이트에서 확인해 볼 수 있습니다. (상당히 많네요...)
'C++' 카테고리의 다른 글
[C++] range-for, if init, if constexpr (0) | 2021.08.12 |
---|---|
[C++] 함수 : Lamda expression (람다 표현식) (0) | 2021.08.11 |
[C++] 함수 : 후위 반환 타입(suffix return, trailing return) (0) | 2021.08.10 |
[C++] 함수 삭제 (function delete) (0) | 2021.08.09 |
[C++] 함수 : template, inline (0) | 2021.08.09 |
댓글