capypad
0 Tage Serie
rust / intermediate
Snippet

Const Functions: Kompilierzeit Berechnung

Const Functions werden in const Kontexten zur Kompilierzeit ausgeführt und ermöglichen echte Zero-Cost Abstraktionen. Im Gegensatz zu C++ constexpr hat Rust const fn strengere Regeln, ist aber für konstante Argumente vollständig zur Kompilierzeit ausgewertet. Dies ermöglicht performance-kritische Konstanten, die einmal während der Kompilierung berechnet werden statt zur Laufzeit. Die Fakultät und Fibonacci Beispiele demonstrieren rekursive und iterative const fn Muster. Seit Rust 1.46 sind die meisten Kontrollfluss-Konstrukte in const fn erlaubt, was komplexe Kompilierzeit-Berechnungen ermöglicht.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const fn factorial(n: u64) -> u64 {
match n {
0 | 1 => 1,
n => n * factorial(n - 1),
}
}
 
const fn fibonacci(n: u32) -> u64 {
let mut a: u64 = 0;
let mut b: u64 = 1;
let mut result: u64 = 0;
let mut i: u32 = 0;
while i < n {
result = a + b;
a = b;
b = result;
i += 1;
}
if n <= 1 { a + b } else { result }
}
 
const FIB_20: u64 = fibonacci(20);
const FACT_12: u64 = factorial(12);
 
fn main() {
println!("Fibonacci(20) = {}", FIB_20);
println!("Factorial(12) = {}", FACT_12);
}
Erklärung
1
const fn factorial(n: u64) -> u64
Funktion aufrufbar in const Kontexten—zur Kompilierzeit ausgewertet wenn Argumente konstant sind
2
const FIB_20: u64 = fibonacci(20)
Const Item zur Kompilierzeit initialisiert—keine Laufzeitkosten für die Berechnung
3
let mut i: u32 = 0; while i < n {...}
While-Schleifen und veränderliche Variablen in const fn erlaubt seit Rust 1.46