프로그래밍C++ 임베디드 개발자

C++에서 link-time와 compile-time 상수성이 어떻게 작동하는지 설명하십시오. constexpr와 const의 차이는 무엇입니까? 각 경우에는 언제 사용해야 합니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

C++에서는 compile-time (컴파일 타임 상수성)과 link-time (링크 타임 상수성)가 있습니다.

  • const 변수는 초기화 후 변경할 수 없는 객체입니다. 그러나 const는 항상 컴파일 타임에 값이 알려져 있음을 보장하지 않습니다. 실행 중에만 계산될 수 있습니다.
  • constexpr는 표현식이나 함수가 컴파일 타임에 계산될 것임을 보장합니다.

예:

const int x = time(0); // const, 하지만 NOT constexpr: 값은 실행 중에 계산됨 constexpr int y = 2 + 2; // constexpr: 컴파일 타임에 알려짐 constexpr int square(int x) { return x * x; } int arr[square(3)]; // 배열의 크기 — 컴파일 타임 표현식

상수 표현식이 컴파일러에서 사용 가능해야 하는 경우, 예를 들어 배열 크기나 템플릿 매개변수에 대해 constexpr를 사용하십시오.

트릭 질문.

constexpr로 선언된 함수가 비상수 인수로 호출될 수 있습니까?

답변: 예! 인수가 컴파일 타임에 알려져 있는 경우 결과는 컴파일 타임에 계산됩니다. 실행 중에만 알려진 인수인 경우 함수는 일반 함수처럼 계산됩니다.

constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // 런타임에 호출됨

주제에 대한 무지로 인한 실제 오류 사례.


이야기

하나의 모듈이 배열 크기를 const int를 통해 설정하고 컴파일 타임 상수라고 가정했습니다. 다른 컴파일러에서는 오류가 발생했으며, 값이 실행 중에 계산되어 배열 크기가 표준에 맞지 않았습니다.


이야기

해시 계산에서 컴파일러는 const 변수가 아닌 constexpr 변수를 사용하였기 때문에 계산 최적화를 할 수 없었습니다. 결과적으로 새로운 릴리스에서 성능이 2배 이상 저하되었습니다.


이야기

현대 표준으로 마이그레이션하면서 키워드를 혼동하여 함수를 const가 아닌 constexpr로 선언했습니다. 이로 인해 compile-time 템플릿 표현식에서 결과를 사용할 수 없었습니다. 빠른 진단에서 오류가 나타났지만, 리뷰 중에 마스터로 넘어갔습니다.