On this page
article
C++ Constexpr
constexpr
- 컴파일 시간에 상수를 만드는 새로운 키워드
- C++ 11
- 상수의 종류
- const int s2 = 10; // 컴파일 시간 상수
- const int s3 = s1; // 런타임 상수
- C99부터 배열의 크기로 변수 사용가능. g++은 지원하나 cl은 지원않으므로 cl로 테스트해보면 런타임상수 이용한 배열같은 경우 컴파일 실
- const
- 컴파일 시간 상수와 실행시간 상수 모두 생성가능
- 변수값으로 초기화 가능
- constexpr
- const로 인한 혼란 방지
- 컴파일 시간 상수만 생성가능. 그러므로 컴파일 시간에 계산되는 값으로만 초기화 가능
- 템플릿 인자로 사용 가능?
structure binding
- c++ 17
- 구조체 또는 배열에서 각 멤버의 값을 꺼낼 때
- 타입은 반드시 auto여야 함 (const, volatile, ref 가능)
struct Point
{ int x{10}; int y{10};
}
int arr[2] = {1,2}
auto [x,y] = pt;
auto [z,k] = arr;
constexpr function
의미
- 컴파일 시간
constexpr 활용
- constexpr 상수 → 이전
- constexpr function
- if constextpr → 추후
활용
- 함수의 인자 값을 컴파일 시간에 결정할 수 있으면 컴파일 타임에 함수를 실행
- 안되면 런타임에 실행
template<typename T, int N> struct Buffer { T data[N]; } constexpr int add(int a, int b) { return a + b; } Buffer<int, n> b2 //error Buffer<int, add(1,2)> b2; // 이런 것이 가능`
제약
- C++11
- 컴파일 시간에 수행되기때문에 return이 한번만 나와야 한다
- C++14
- 일부 제약 잔여
- 파일을 오픈하거나 동적 메모리 할당 불가
- 가상함수 불가
- C++11
if constexpr
- 내용
- 컴파일 시간에 조건식을 조사
- static if라고도 함
- C++17
- 보통 라이브러리 설계, 템플릿 만들 때 사용
- 활용
기본
if constexpr (sizeof(n) == 0)
조건에 따라 특정 코드 생성방지
template<typename T> void foo(T a) { if constexpr (0) *a = 0; // 이제 ptr인지아닌지 이런 검사가 들어가는 }