Brise

[C++ 기본] 5. constexpr 본문

프로그램/C,C++

[C++ 기본] 5. constexpr

naudhizb 2022. 1. 15. 13:09
반응형

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