프로그래밍시스템 Rust 개발자

러스트에서 상수 평가(const evaluation)는 어떻게 작동합니까? const와 static, let의 차이점은 무엇이며, const fn을 사용할 수 있는 경우와 사용해야 하는 경우는 무엇입니까? 컴파일 시간에 계산을 작성할 때의 제한 사항은 무엇입니까?

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

답변.

러스트의 상수 평가는 프로그램 실행 중이 아니라 컴파일 시간에 일부 계산 또는 초기화를 수행할 수 있게 해줍니다.

  • const는 메모리 주소를 가지지 않는 컴파일 시간에 계산되는 불변 상수를 선언합니다:
const PI: f64 = 3.1415;
  • static은 특정 메모리 세그먼트(일반적으로 .data 또는 .bss)에 위치하는 글로벌 변수를 선언하며, 변수가 mutable일 수 있습니다(unsafe 요구):
static mut GLOBAL_COUNTER: i32 = 0;
  • let은 스택에 변수를 만들 때 사용되며, 이들의 값은 런타임에 계산될 수 있으며, 첫 번째 사용 전에 초기화해야 합니다.

const fn은 const 또는 static 값 설정에 사용될 수 있는 결과를 반환하는 함수입니다. 이러한 함수는 상수 컨텍스트에서 호출될 수 있습니다.

const fn factorial(n: usize) -> usize { if n == 0 { 1 } else { n * factorial(n - 1) } } const FACT_5: usize = factorial(5); // 컴파일됩니다!

const fn의 제한 사항:

  • 다른 const fn만 사용할 수 있습니다,
  • 힙 할당(Box::new 등)은 사용할 수 없습니다,
  • 안전하지 않은 작업을 호출할 수 없습니다,
  • 외부 변수 및 함수에 접근할 수 없습니다(이들이 const fn이 아닌 경우).

함정 질문.

질문: 만약 결과가 변하지 않는다면, const 컨텍스트에서 어떤 함수도 사용할 수 있습니까? 예를 들어, 이렇게:

fn add(a: i32, b: i32) -> i32 { a + b } const RES: i32 = add(1, 2);

일반적인 잘못된 답변: 예, 함수가 순수하고 결과가 미리 알려져 있으므로 가능합니다.

정답: 아닙니다, 함수는 명시적으로 const fn으로 선언되어야만 const 초기화 내에서 호출할 수 있습니다. 일반 함수는 실행 시간에만 호출됩니다!

예시:

const fn add(a: i32, b: i32) -> i32 { a + b } const RES: i32 = add(1, 2); // 컴파일됩니다!

주제에 대한 미세한 스킬 부족으로 인한 실제 오류 사례.


이야기

3차원 기하학 계산 프로젝트에서 개발자가 일반 함수의 반환 값을 통해 값 테이블을 선언하려고 했으나, const fn이 아닌 경우 컴파일 오류가 발생했고, 컴파일 시간 계산의 이익을 잃었습니다.


이야기

글로벌 캐시에 static mut을 사용한 결과 여러 스레드에서 접근할 때 데이터 경쟁이 발생했습니다(static mut은 안전하지 않습니다!). 글로벌 리소스에 대한 접근을 동기화하기 위해 Atomic 또는 Mutex를 사용해야 했습니다.


이야기

큰 배열의 초기화를 가속화하려고 static으로 정의했지만, static이 항상 고정 주소를 가지는 것을 잊어버려서 데이터가 프로세서의 캐시에 로컬로 저장되지 않고, 서버 로직의 핫 경로에서 연산 속도가 느려졌습니다. 런타임에서 계산을 하지 않는 지역 let 표현식을 사용해야 했습니다.