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

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

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

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

constexpr 에 대해 적어보겠습니다.

constexpr c++11 부터 도입된 문법으로 컴파일 시간 상수를 만드는 새로운 키워드입니다.

해당 문법이 무었인지 왜 도입되었는지를 아시려면 일단 const에 대한 이야기부터 해야 합니다.

const

const 키워드는 함께 정의한 변수의 값이 수정이 불가능하다고 보시면 됩니다. constexpr 역시 해당 기능을 가지고 있습니다.

int main()
{
	const int n1 = 0;
	n1 = 10; //error 불가능

	constexpr int n2 = 0;
	n2 = 10; //error 불가능
}

실행시간시 해당 변수에 접근하여, 값 수정이 불가합니다.

 

다음 문법부터는 약간 아리송한 요소가 발생합니다.

int main()
{
	const int n1 = 10; //a
	int n2 = 10;
	const int n3 = n2; //b

	int arr1[10];
	int arr2[n1];
	int arr3[n2]; //c 불가
	int arr3[n3]; //d 불가
}

 a, b 둘 다 문제가 없는 const 상수입니다. 

 

 c 는 일반 변수로 배열의 크기를 지정하는 코드입니다. 컴파일러마다 이슈가 조금 있긴 한데요, 일반적으로 허용되지 않는 경우가 많습니다.

 

 d는 왜 안될까요? n3 역시 변경할 수 없는 상수인데??

 n1, n3은 미묘한 차이가 있습니다. n1은 컴파일 시간부터 값을 알 수있는 const 상수입니다. 히자만 n3은 일반변수로 초기화된 const 상수입니다. 이는 컴파일시간에 정확한 값을 알수 없다는 의미입니다. n3는 단지 변경할 수 없는 상수로써의 의미가 큽니다.

 

  const 상수는 변수 값으로 초기화를 할 수 있습니다. 이게 허용되며 const로 선언된 상수들은 속성 차이를 가지게 됩니다.

 

 많은 컴파일러들은 컴파일 시간에 알 수 없는 값으로 변수의 크기를 지정하는 코드를 error 처리합니다.

 

 그래서 n1, n3 은 const 상수이지만

n1 = 컴파일 시간에 크기를 알 수 있는 상수, 동적으로 크기 변경 불가능

n3 = 컴파일 시간에는 크기를 모르지만, 동적으로는 크기 변경 불가능

이라는 차이를 가지게 됩니다.

 

constexpr

 그래서 constexpr 이 등장하게 된 것입니다.

int main()
{
	int n = 10;

	const int n1 = 10;
	const int n2 = n;

	constexpr int n3 = 10;
	constexpr int n4 = n; //a 불가능
}

 constexpr은 변수로 초기화가 불가합니다. constexpr은 컴파일 시간에 크기를 알 수 있는 상수를 의미합니다. 기존 const가 가지고 있단 모호성이 제거됩니다.

 

 사실 이런 기술은 템플릿 프로그래밍 시 더 유용합니다. 배열을 통한 설명은 설명하기 쉬운 예라 한 것뿐...

 

차이점 아실 수 있을 거라 생각합니다.

constexpr의 용도를 아시고 적용하시면 더 좋은 코드를 만들 수 있을 거예요.

 

배워두면 먹고 사는데 도움이 됩니다...ㅠㅠ

반응형

댓글