Înainte de apariția facilității Const Generics, genericele din Rust puteau fi parametrizate exclusiv pe tipuri de date (cum ar fi Vec). Dacă aveam nevoie de un vector cu capacitate fixă pe stivă, trebuia fie să hardcodăm dimensiunea, fie să folosim crate-uri complexe bazate pe hack-uri de tipuri numerice pe tipuri de date.
Const Generics permite ca parametrii generici să fie valori constante concrete (numere întregi usize, u32, caractere char sau booleene bool). Acest lucru deblochează scrierea de cod ultra-performant, verificabil matematic la compilare, fără nicio alocare pe heap.
// Structură de matrice cu dimensiuni verificate static la momentul compilării:
#[derive(Debug, PartialEq)]
pub struct Matrice {
pub date: [[T; COLOANE]; RANDURI],
}
impl Matrice {
pub fn zero() -> Self {
Matrice {
date: [[T::default(); C]; R],
}
}
}
impl Matrice {
// Înmulțirea a două matrici: Matrice * Matrice = Matrice
// Observați: Compilatorul impune OBLIGATORIU ca numărul de coloane din prima matrice
// să fie IDENTIC cu numărul de rânduri din a doua matrice!
pub fn inmulteste(&self, alta: &Matrice) -> Matrice
where
T: Copy + Into,
{
let mut rezultat = Matrice:: {
date: [[0.0; K]; R],
};
for i in 0..R {
for j in 0..K {
let mut suma = 0.0;
for p in 0..C {
suma += self.date[i][p].into() * alta.date[p][j].into();
}
rezultat.date[i][j] = suma;
}
}
rezultat
}
}
fn main() {
let m1 = Matrice::::zero(); // 2 rânduri, 3 coloane
let m2 = Matrice::::zero(); // 3 rânduri, 4 coloane
// Valabil la compilare: (2x3) * (3x4) -> (2x4)
let m3 = m1.inmulteste(&m2);
println!("Dimensiune rezultat: {}x{}", m3.date.len(), m3.date[0].len());
// Următoarea linie ar genera o eroare IMEDIATĂ de compilare (mismatched types):
// let m_invalida = m2.inmulteste(&m1); // Eroare: coloanele lui m2 (4) != rândurile lui m1 (2)!
}
Avantaje Cheie în Aplicații Critice
- Zero Bounds Checking Overhead: Compilatorul știe cu precizie dimensiunea exactă a matricelor și poate vectoriza buclele prin instrucțiuni AVX-512 / NEON fără verificări de depășire de index la runtime.
- Alocare Garantată pe Stivă: Nu există nicio apelare la alocatorul global de memorie (heap allocator), asigurând latență deterministă ideală pentru sisteme embedded sau audio în timp real.
Întrebări & Exemple de Cod:
Const Generics Avansat în Rust: Parametrizarea Tipurilor pe Valori și Matrici la CompilareAi o nelămurire despre utilizarea comenzii
Const Generics Avansat în Rust: Parametrizarea Tipurilor pe Valori și Matrici la Compilaresau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.