개발/C++

[C++] constexpr (상수표현식) 사용법 및 예제

hojak99 2017. 3. 10. 22:04

출처 : 시작하자! C++17 프로그래밍



/*
	constexpr 지정자로 선언된 생성자는 클래스를 단순화시키는 동시에 객체 생성과 동시에
	멤버 변수를 초기화시킬 목적으로 사용한다.

	사용법 ::
	1. constexpr 데이터-타입 상수-이름 = 식
	2. constexpr 데이터-타입 상수-이름(식)
	3. constexpr 데이터 타입 함수 이름(인수)
	4. constexpr 생성자(인수)
*/

#include <iostream>

struct complex
{
	constexpr complex(double r, double i) : re(r), im(i) {}
	constexpr double real() const { return re; }
	constexpr double imag() const { return im; }

private:
	double re;
	double im;
};

constexpr double square(double x) { return x*x; }

int main()
{
	// 인수로 리터럴 사용했으므로 사용가능. comp 변수는 상수로 사용된다.
	constexpr complex comp(0.0, 1.0);
	double x = 1.0;

	// constexpr 지정자로 선언된 변수는 상수를 의미하므로 에러 발생
	// constexpr complex cx1(x, 0);

	// 상수표현식으로 선언된 생성자는 인라인 함수로 인식되므로 일반 객체 생성하는데 문제 X
	complex cx1(x, 10);

	// cx2 변수는 const 상수로 선언되어 있기 때문에 허용
	const complex cx2(x, 1);

	int var = 17;
	const int dmv = 17;
	constexpr double max1 = 1.4 * square(dmv);

	// 오류 발생 var 이 함수의 인자로 상수가 아닌 변수를 사용했기 때문에.
	// constexpr double max2 = 1.4 * square(var);

	// const 상수는 변수를 사용하더라도 변수가 초기화 되어있으면 가능
	const double max3 = 1.4 * square(var);

	return 0;
}


/*
	constexpr 상수와 const 상수의 차이점은 다음과 같음.
	- 상수표현식 상수는 컴파일하는 시점부터 상수로 인식
	- const 상수는 프로그램이 실행되는 시점부터 상수로 인식
	
	- 상수표현식 지정자는 성능을 보장하기 위해 사용
	- const 지정자는 안정성을 확보하기 위해 사용
*/


인라인 함수나 일반 함수 그리고 생성자를 사용하기에 앞서서 성능 향상에 도움이 되는 상수표현식을 사용하는 것이 좋다고 한다.

반응형