C++ 20 : consteval/constinit

RuuNee
|2024. 5. 17. 18:28
반응형

 

int SqrRunTime(int n)
{
	return n * n;
}

//C++11
constexpr int SqrRunOrCompileTime(int n)
{
	return n * n;
}

//C++20
consteval int SqrCompileTime(int n)
{
	return n * n;
}

 

위의 함수를 호출했을 때 차이점에 대해 알아보자.

 

void main
{
    int val1 = SqrRunTime(10);
    constexpr int val2 = SqrRunOrCompileTime(10);
    int val3 = SqrCompileTime(10);
}

 

 

일반 함수는 런타임 단계에서 실행된다.

 

constexpr이 붙은 함수는 컴파일 단계 또는 런타임 단계 중 더 나은 방향으로 실행 됨.

여기서는 constexpr을 변수 앞에 붙였기 때문에 컴파일 단계에서 실행됨.

 

consteval이 붙은 함수는 무조건 컴파일 단계에서 완성되어야 한다.

 

그래서 디버깅을 해서 어셈블리어를 보면 위와 같이 val2와 val3는 바로 값이 들어가는 모습이다.

 

consteval 특징
-조건부 jump,loop 가능
-다수의 명령어로 구성 가능
-constexpr 함수 호출 가능
-static, thread_local 안됨
-try,goto 안됨
-non-consteval 함수 호출 안됨
-non-constexpr 데이터 사용 안됨


변수 (const vs constexpr vs constinit)

 

const (컴파일타임 또는 런타임에 초기화 + constness(상수성))
const 변수의 초기화는 런타임까지 지연시킬 수 있다.

 

const int constIntVal = SqrRunTime(10);

constIntVal++; X

 

 

constexpr(컴파일타임에 초기화 + constness(상수성))
constexpr 변수는 반드시 컴파일 타임에 초기화가 되어야 한다.


constexpr int constExprVal = SqrRunOrCompileTime(10);
constExprVal++; X

 

 

constinit 특징 (컴파일타임에 초기화 되어야 함 + constness 없음 + static/thread_local에 붙어야 함)
-gloabl 변수, static 변수, thread_local 변수를 대상으로 사용.
-프로그램 시작 시 메모리 할당, 프로그램이 끝나면 메모리 해제
-thread_local 변수는 thread에 종속적. 특정 thread가 해당 데이터를 사용할 때 생성됨.

constinit thread_local int constInitVal = SqrRunOrCompileTime(10);
constinit thread_local int constInitVal2 = SqrRunTime(10); X

반응형