C++

C++ const 와 constexpr

const

const 를 선언함으로서 값을 고정할 수 있다.
실수를 줄일 수 있기 때문에 const 를 쓸 수 있는 상황에서는 무조건 사용하는 게 좋다.
아래와 같은 쓰임새가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
class Example
{
public:
// 파라메터를 const 로 해서, 함수 내부에서 inpString을 변경하지 못하게 함
void setString(const std::string& inpString);
// 리턴을 const 로 해서, 외부에서 멤버 str 을 변경하지 못하게 함
const std::string& getStringRef();
// print 만 수행하는 함수이므로 함수 내부에서 멤버 변수를 변경하지 못하게 함
void printString() const;

private:
std::string str;
}

constexpr

C++11 에 도입된 것으로, const 와 비슷하지만 constexprCompile time에 값이 결정되기를 원할 때 사용한다. 또 compile time 에 값을 결정하는 방법으로는 템플릿 메타 프로그래밍을 이용하는 방법이 있는데 가독성이나 사용성면에서나 constexpr 로 사용하는 것이 좋겠다.

그런데 함수를 constexpr 로 선언하더라도 compile time 에 결정될 수 있고 runtime 에 결정될 수도 있다. 이는 컴파일러의 어떤 평가 기준에 따라 결정 되는데 항상 compile time 에 결정되기 원하는 값이라면 리턴을 받는 변수를 constexpr 로 선언하면 된다.
연산량이 너무 많다면 compile time 에 결정하지 못할 수도 있다. (Compile error 발생)
아래 코드를 보면서 이해해보자.

1
2
3
4
5
6
7
8
9
10
11
constexpr int Factorial(int n)
{
return n <= 1 ? 1 : n * Factorial(n - 1);
}

// "constexpr int retVal" 로 받기 때문에 compile time 에 결정한다.
constexpr int retVal = Factorial(3);

// 변수를 사용할 시 runtime 에 결정
int a = getInp;
int retVal = Factorial(a);