반응형
Notice
Recent Posts
Recent Comments
Link
Brise
[C++ 기본] 5. constexpr 본문
반응형
C++에서는 C언어의 const보다 좀 더 strict한 형태의 상수를 지원한다. const의 경우 상수이며 선언할 때 할당한 값 이후로 값을 부여 불가능하지만, constexpr은 컴파일 시 값이 정해져 있어야 한다는 특징을 가지고 있다.
#include <iostream>
int main()
{
int arr1[10]; // ok
int size = 10;
int arr2[size]; // C89 : 배열의 크기는 컴파일 시간에 알아야 한다.
// C99 : 배열의 크기로 변수도 가능
// g++(gcc)지원, VC++ 지원 안함
//sub esp, size
const int size2 = 10; // 컴파일 시간 상수
int arr3[size2]; // ok
const int size3 = size; // runtime 상수
int arr4[size3]; // error
foo(size);
}
void foo(const int s)
{
int x[s]; // 될까요 ?? vc에서 error
}
배열의 경우 컴파일러에 따라 크기를 변수로 할 수도 있고 상수로 할 수도 있다. 이는 C문법 버전에따라, 컴파일러에 따라 다를 수 있다.
#include <iostream>
int main()
{
//const int c = 10; // 컴파일 시간 상수
int n = 10;
const int c = n; // runtime 상수
// 컴파일시 값은 알수 없다.
// 하지만, 값을 변경하려면 error
//c = 20;
// int *p = &c; // error
int *p = (int*)&c; // ok.
*p = 20;
std::cout << c << std::endl; // 10 20
std::cout << *p << std::endl; // 20 20
}
const 타입 변수의 경우 값을 런타임에 부여할 수 있고, 해당 변수에 직접 입력하려고 하면, 오류가 발생하나, 포인터 연산을 통하여 컴파일러가 const 변수의 주소에 값을 부여하는 것을 감지 못하게 하여 회피할 수 있다.(human-error의 발생 가능성 있음)
int main()
{
int n = 10;
// const : 컴파일 시간/실행시간 상수 모두 가능
const int c1 = n; // ok
const int c2 = 10; // ok
// C++11. constexpr : 컴파일 시간 상수만 가능.
constexpr int c3 = n; // error
constexpr int c4 = 10; // ok
}
따라서 C++의 경우 constexpr 키워드를 사용하여 런타임에서 추적이 어려운 오류를 사전에 막을 수 있다.
// C++11 에서 추가된 constexpr의 용도
// 1. constexpr 상수
// 2. constexpr 함수
// 3. constexpr if
//int g = 10;
// constexpr 함수 : 함수 인자로 전달된 값을 컴파일 시간에
// 알수있다면 함수 수행도 컴파일 시간에 수행.
constexpr int add(int a, int b) { return a + b; }
int main()
{
int a = 1, b = 2;
int arr1[ add(1, 2) ]; // ok
// int arr2[ add(a, b) ]; // error
int n3 = add(a, b); // ok.. a, b는 컴파일 할때 값을
// 알수없으므로실행시간에 수행되는 함수
}
constexpr은 변수 뿐만 아니라 함수에도 적용이 가능하다. 물론 해당 변수가 인자에 따라 항상 같은 값을 반환해야 한다는 조건이 붙으며, 컴파일 시간에 정해질 수 없는 경우 변수처리되어 런타임 시간에 처리되게 된다.
반응형
'프로그램 > C,C++' 카테고리의 다른 글
[C++ 기본] 8. 반복문 (0) | 2022.01.29 |
---|---|
[C++ 기본] 7. template function (0) | 2022.01.16 |
[C++ 기본] 6. Function (0) | 2022.01.15 |
[C++ 기본] 4. Variable (0) | 2022.01.14 |
[C++ 기본] 3. 입출력 (0) | 2022.01.14 |
[C++기본] 2. namespace (0) | 2022.01.14 |
[C++기본] 1. Hello world! (0) | 2022.01.14 |
Comments