• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

constexpr을 사용했을때의 장점

23.03.10 15:52 작성 조회수 894

2

2.9강 9:10초 정도부터 컴파일 내에서 정해지는 상수를 정의할때 constexpr을 사용할 수 있다고 하셨는데 const말고 constexpr을 사용 했을때 장점이 무엇인가요?

제가 생각했을때의 장점은 런타임중에 정해지는 상수에만 const를 쓰니까 컴파일중 정해지는 상수와 좀더 쉽게 구분할수 있다...정도인데 이게 constexpr을 쓰는 이유가 맞나요?

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

답변 1

답변을 작성해보세요.

4

Soobak님의 프로필

Soobak

2023.03.11

안녕하세요, 답변 도우미 Soobak 입니다.

질문해주신 강의 2.9 심볼릭 상수 symbolic constants8:18 부분의 코드를 발췌해보겠습니다.

int main()
{
    const int my_cnost(123);
    
    int number;
    cin >> number;

    const int special_number(number);

    //...

    return 0;
}

이 때, my_const 상수는 컴파일 타임에 결정되고, special_number 상수는 런타임에 결정이 됩니다.
그런데, 위와 같이 둘 다 const 한정자로 자료형을 수식하면, 두 상수가 각각 '컴파일 타임에 결정된다는 점' 과 '런타임에 결정된다는 점' 을 문법상으로 구분할 수가 없습니다.

constexpr 한정자는 수식된 변수가 컴파일 타임에 결정되는 상수라는 것을 컴파일 타임에 체크하도록 하는 키워드 이므로, 수식된 변수가 컴파일 타임에 결정된다는 점을 문법상으로 구분할 수 있게 됩니다.

constexpr 한정자의 장점은 대표적으로 다음과 같습니다.

  1. 코드 가독성 향상

    constexpr 한정자를 사용하면 코드의 의도를 좀 더 명확하게 표현할 수 있습니다. 코드만 보고도 해당 상수가 런타임이 아닌, 컴파일 타임에 결정되는 상수라는 것을 알 수 있죠.

  2. 컴파일 오류 쉽게 확인
    만약, constexpr 한정자로 수식한 변수를 시간, 난수, 외부 입력 등 런타임에 결정되는 값으로 초기화 하게 된다면, 컴파일러는 오류를 발생시키므로, 코드의 오류를 쉽게 확인할 수 있게 됩니다.

  3. 런타임 비용 절감

    constexpr 한정자를 사용한 일부 경우에서 컴파일러가 코드를 컴파일 타임에 결정하도록 하면, 런타임에서 계산할 필요가 없게 됩니다. 따라서, 런타임 비용이 절감됩니다.

이 외에도 다양한 장점이 있으며, 3 번과 관련하여 constexpr 한정자를 사용한다고 해서 항상 런타임 비용이 절감되는 것도 아닙니다. (만약, constexpr 한정자로 반환값을 수식한 함수가 굉장히 복잡하고 계산이 오래걸린다면, 컴파일 타임이 길어지게 되고, 빌드 시간이 늘어나며, 컴파일러가 생성한 코드의 크기가 커지게 되고, 따라서 메모리 사용량이 증가하며 프로그램의 성능 저하로 이어질 수도 있습니다. 따라서, 상황에 맞게 적절한 선택을 고려해야 합니다.)

하지만, 지금의 질문자님의 진도에서는 "constexpr 한정자를 사용함으로서 수식된 변수가 컴파일 타임에 결정된다는 것을 const 한정자에 비해 명확히 할 수 있고, 컴파일 타임에 체크가 되는 구나" 정도만 이해하시면 충분하실 것 같습니다. 앞으로도 꾸준히 강의를 학습하시다보면, 다양한 경우에 대해서 교수님께서 설명해주시므로 점점 더 넓은 시야로 많은 지식들을 얻으실 수 있을 거에요. 😁

질문해주셔서 감사하고, 강의에서 학습하신 내용을 바탕으로 무엇인가 더 추가적으로 궁금증을 갖는 자세가 멋있으십니다. 만약 답변드린 내용 이외에도 더 궁금하신 점이 있으시면, 다른 통로를 통해 검색해보시거나, 학습자료를 찾아보시는 것도 추천드립니다. 앞으로도 꾸준히 화이팅 하시길 바랄게요.

추가적으로 또 궁금하신 점이 있으시면 언제든 편하게 댓글 남겨주세요. 감사합니다. 화이팅!