- Comprendre stack vs heap
- Voir comment Rust gère la mémoire
- Optimiser l'utilisation mémoire
- Comprendre les allocations
| Term | Definition |
|---|---|
| Stack | Mémoire rapide pour données de taille fixe |
| Heap | Mémoire flexible pour données de taille variable |
| Allocation | Réservation de mémoire |
| RAII | Resource Acquisition Is Initialization |
| Drop | Trait pour libération automatique |
La mémoire, c'est comme deux types de stockage :
- Stack : Comme un casier - rapide, taille fixe, organisé
- Heap : Comme un entrepôt - flexible, taille variable, moins rapide
Rust gère automatiquement la mémoire grâce au système d'ownership, sans garbage collector.
fn main() {
let x = 5; // Sur la stack
let y = x; // Copie sur la stack
println!("{}", x); // x toujours valide
}Caractéristiques Stack :
- Très rapide
- Taille fixe connue à la compilation
- Libération automatique (LIFO)
- Pas de fragmentation
fn main() {
let s = String::from("hello"); // Sur le heap
// s possède la mémoire sur le heap
// Libérée automatiquement quand s sort de portée
}Caractéristiques Heap :
- Plus lent (allocation/désallocation)
- Taille variable
- Géré par ownership
- Peut fragmenter
STACK HEAP
┌─────────┐ ┌─────────────┐
│ x: 5 │ │ │
│ y: 5 │ │ "hello" │
│ s: ptr──┼───────────────────>│ len: 5 │
│ len:5 │ │ cap: 5 │
│ cap:5 │ └─────────────┘
└─────────┘
struct File {
// Ressource système
}
impl Drop for File {
fn drop(&mut self) {
// Libération automatique quand sort de portée
println!("Fichier fermé");
}
}
fn main() {
let file = File::open("test.txt");
// file sera automatiquement libéré ici
}// Éviter les allocations inutiles
let vec = Vec::with_capacity(100); // Pré-allouer
// Utiliser &str au lieu de String quand possible
fn process(s: &str) { } // Pas d'allocation
// Réutiliser les buffers
let mut buffer = Vec::new();
// Réutiliser buffer au lieu de créer de nouveauxLa gestion mémoire de Rust empêche :
- Use-after-free : Ownership garantit la validité
- Double-free : Un seul propriétaire
- Memory leaks : Libération automatique
- Buffer overflows : Vérification des bounds