본문 바로가기

C++

[C++] const vs constexpr

이제 ft_containers 하려고  vector class header를 좀 들여다 봤더니

무수히 많은 constexpr.. noexcept 들의 향연..

저게 도대체 뭔가? 해서 한번 알아봤다.

 

c++11부터는 constexpr 이라는 키워드를 쓸 수 있다. 

 

constexpr variable is guaranteed to have a value available at compile time. whereas static const members or const variable could either mean a compile time value or a runtime value. Typing constexpr express your intent of a compile time value in a much more explicit way than const.

 

스택오버플로우의 한 답변인데,

 

constexpr 변수는 컴파일 타임에 값을 가지고 있음이 보장된다고 한다. 그에 반해 static const 멤버 혹은 const 변수는 값이 컴파일 타임에 정해질 수도 있고 런타임에 정해질 수도 있다고 한다. 그래서 const를 쓰는 것 보다 constexpr 를 쓰는 것이 "이 값이 컴파일 타임에 무조건 결정 되는 값이다" 라는 의도를 더 명시적으로 나타낼 수 있다는 것 까지.

 

아~ 뭔가 감이 와서 한번 테스트 코드를 작성 해봤다.

#include <iostream>

int	main(int argc, char **argv)
{
	(void)argv;
	int a;
	a = argc;
	static const int b = a;
	std::cout << b << std::endl;
	return (0);
}

 

const는 이런게 된다는 말이겠지? 

실행결과는?

 

역시 잘 됨.

실행이 되기 전까지는 변수의 값을 알 수 없을 테지만 컴파일 에러 없이 실행이 잘 된다.

 

그럼 constexpr는?

 

이런걸 못 한다는 말이다.

 

컴파일러도 이렇게 알려준다. ㅋㅋ 

 

그리고 스택오버플로우 링크의 답변을 더 읽어보면 알 수 있겠지만 간략히 쓰자면

function scope의 static const 변수의 값이 compile time에 정해지지 않는 경우 그 함수를 조~금 느려지게 한다. 왜냐면 런타임에 그 함수의 첫번째 호출에 변수를 초기화를 시켜야 하고, 그 변수가 초기화가 됐나~ 안 됐나 매번 확인을 해야 하기 때문에.

 

constexpr의 장점은 이런 데서 온다고 할 수 있다. 컴파일 타임에 정해져야 하는 값이 정해지지 않은 채로 컴파일을 시도할 때, 좀 더 느린 동작을 하는 함수를 실행시키게 되는게 아니라 아예 컴파일 에러를 발생 시킨다. 컴파일타임에 값을 결정할 방법이 없으면 컴파일러가 그걸 알려 주고, 내가 이에 대해 어떠한 조치를 취할 수 있게 되는 것이다.

 

뭐 어쨌든.. 과제는 c++98 로만 구현을 해야하기 때문에..^^ 의도를 명확히 해서 첫번째 예시와 같은 상황이 발생 하지 않도록 하는 것이 방법이겠다.. 

'C++' 카테고리의 다른 글

[C++] lexicographical 이란?  (0) 2022.11.21
[vector container] operator[] vs at  (0) 2022.09.14
[C++] this 는 NULL인 경우가 있는가?  (0) 2022.07.19
[C++] 클래스 동적 배열 초기화  (0) 2022.07.19
[C++] 인스턴스화 (instantiate) 란?  (0) 2022.07.16