본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 16. C++ constexpr function

by 신림83 2020. 10. 26.
반응형

CPP 초급 강좌 16. C++ constexpr function

 c++11부터 사용 가능한 constexpr function을 보자. 이전에 constexpr에 대하여 공부했었다. 기억이 안나는 분들을 위해 아래 링크를 남겨두겠다. 컴파일 시간에 사용하는 상수라는 계념이었다. 

constexpr 무었?

 

CPP 초급 강좌 9. C++ constexpr, const

CPP 초급 강좌 9. C++ constexpr, const constexpr 에 대해 적어보겠습니다. constexpr c++11 부터 도입된 문법으로 컴파일 시간 상수를 만드는 새로운 키워드입니다. 해당 문법이 무었인지 왜 도입되었는지를 �

sillim83.tistory.com

constexpr function?

 함수의 인자를 컴파일 시간에 알 수 있으면, 해당 함수를 컴파일 시간에 실행하여 결괏값을 미리 처리해둔다. 하지만 알 수 없으면 일반 함수처럼(실행시간에 실행) 동작한다.

 

다음 예제를 보자.

constexpr int f1(int a)
{
	return a + a;
}

int main()
{
	int n1 = f1(0);		//a
	int n2 = f1(n1);	//b
}

 위의 설명대로, a는 인자로 리터럴 0이 입력되었으므로 컴파일 시간에 실행되어 결괏값이 미리 반영될 것이다. b는 변수를 사용했으므로 일반 함수처럼 동작한다. constexpr function은 코드 최적화 관련 강력한 기술임이 분명하다. 용도에 맞게 사용하면

 

템플릿 인자 정수형을 통하여 좀 더 알아보자.

 조금 더 설명을 위해 템플릿 인자에 정수형을 사용할 수 있다. 이것이 제약조건이 있는데 해당 정수형은 컴파일 시간에 반드시 알아야 한다는 것이다. 이것으로 관련 코드를 테스트해보자.

template <typename T, int N>
class Point
{
	T x[N];
	T y[N];
};

constexpr int f1(int a)
{
	return a + a;
}

int main()
{
	int n1 = f1(1);		//a
	int n2 = f1(n1);	//b

	Point<int, 100> pt1;		//c
	Point<int, f1(1)> pt2;		//d
	Point<int, f1(n1)> pt3;		//e
}

템플릿 관련 코드가 어려우시면 다음 링크를 보자.

나중에 링크 넣자.

 

c는 원래 되는 코드다.

d 또한 f1(1)이 컴파일 시간에 계산되어 템플릿이 문제없이 만들어진다.

e 는 에러이다. f1(n1)은 일반함수 호출과 같아서 실행시간에 계산된다. 템플릿 인자 정수형은 꼭 컴파일 시간에 정확한 값을 알 수 있어야 한다. 실행되지 않는다.

 

constexpr function 제약조건

 해당 기능은 강력하나, 제약조건들이 있다.

 

c++11  

 return 문이 문장 내부에 하나만 존재해야 한다. 분기문 등으로 여러가지 return 문을 존재시킬 수 없다. 상위 버전에서는 다음 제약은 없어진다.

 

c++14

 파일 오픈, 동적 메모리 할당 등을 할 수 없다.

가상 함수가 될 수 없다.

등등등... 

 

배울게 너무 많구만...

  봐주셔서 감사합니다.

반응형

댓글