코딩 규칙 : const 보다는 constexpr을 사용하자.240610

보물창고·2022년 8월 10일
0

c++ basic 코드누리

목록 보기
7/50

결론

: const 보다는 constexpr 키워드를 사용하자!!

변수에서의 const vs constexpr

결론
: const보다는 constexpr을 사용하자.

  • constexpr vs constexpr의 차이를 분명히 알자.

정의

: const 는 런타임, 컴파일 타임에 결정됨.
:: constexpr은 컴파일 타임에 결정됨.

예시

  • 차이를 분명히 알 수 있는 코드

    배열의 크기는 컴파일 시간에 결정됨.
    1) const 는 런타임 시간에 값을 결정
    2) constexpr은 컴파일 시간에 값을 결정.

// 아래에 정의가 있음.

배열의 크기를 통해서 확인해보자.

: 배열의 크기는 반드시 상수값만 들어와야 한다.

  • 추가적으로 const 변수에는 런타임 처리되는 변수를 넣을 수 있지만,
    constexpr은 컴파일 타임에만 처리되기 때문에 변수를 넣을 수 없다.
    -> 아래 코드를 보면, n 은 const int 여서 변수를 넣을 수 있다.
    -> n2는 constexpr int 이기 때문에 변수를 넣을 수 없다.!
  • const 나 constexpr 의 std표준 입력의 연산자 오버로딩은 제공하지 않고 있음.

상수의 의미

: 변하지 않는 값을 의미하는데, 있는 그대로 표현을 확인하면,
상수 = 변수 도 가능한 것이 const 변수이고,
상수 = 상수 만 가능한 것이 constexpr 임.

const

개념
: 컴파일 시간뿐만 아니라 런타입 시간에 상수의 값을 결정할 수 있음.

  • 특징
    가) 배열의 크기로 런타임에 결정된 const 변수를 넣을 경우, 불가함!
    - 배열은 컴파일 시간에 배열크기가 결정되기 때문임.
    나) 변수명으로 초기화가 가능함.
  • 예시
    int n = 10;
    const int c1 = 10;
    // 이 때는 컴파일 시간에 결정되는 상수 , 배열 크기로 사용가능.
    const int c2 = n;
    // 이 때는 런타임 시간에 결정됨. 배열 크기로 사용불가.

problem

: 위의 내용을 토대로,
가) const 변수에 리터럴값을 넣어보고, (컴파일)
나) const 변수에 변수를 넣어보고, (런타임)
다) 배열의 크기에 가)와 나)로 처리한 변수를 각각 넣어보자.
-> 배열의 크기는 컴파일 시간에 결정되는 것이므로,
런타임에 처리되는 변수는 불가함.

constexpr 변수.

개념
: 컴파일 시간에만 상수의 값을 결정함.

  • template 과 constexpr 함수에 주로 사용.
  • 특징
    : 변수값으로 초기화 불가함.

problem

가) constexpr 변수에 리터럴값을 넣은후, 배열의 크기에 넣어보자.
나) constexpr 변수에 변수명을 넣은 후, 배열의 크기에 넣어보자.
-> 15번줄을 보면, 변수를 넣을 수 없는 것을 확인할 수 있다.
-> 배열의 크기는 컴파일 시간에 결정되기 때문에 const는 넣을 수 없고(위에 확인함.) , constexpr 변수를 넣을 수 있다.

차이점.

: const변수는 어쩔 때는 런타임값도 들어가지고, 배열에서는 왜 또 안되는 거야?
배열의 크기는 컴파일 시간에 결정된다. const 변수는 런타임, 컴파일 시간에 결정되는 특성이 있다.

하지만, constexpr은 컴파일 시간에만 값을 결정하므로,
컴파일러가 컴파일 타임 상수를 보장하므로, 최적화도 됨.

profile
🔥🔥🔥

0개의 댓글