러스트의 상수 평가는 프로그램 실행 중이 아니라 컴파일 시간에 일부 계산 또는 초기화를 수행할 수 있게 해줍니다.
const PI: f64 = 3.1415;
static mut GLOBAL_COUNTER: i32 = 0;
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의 제한 사항:
Box::new 등)은 사용할 수 없습니다,질문: 만약 결과가 변하지 않는다면, 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 표현식을 사용해야 했습니다.