Box
Умный указатель
Box<T>в Rust используется для хранения данных в куче (heap) вместо стека (stack). Вот основные аспекты:
Тип
Box<T>является умным указателем, поскольку он реализует трейтDeref, который позволяет обрабатывать значенияBox<T>как ссылки. Когда значениеBox<T>выходит из области видимости, данные кучи, на которые указываетbox, также очищаются благодаря реализации типажаDrop.
Основное назначение Box:
- Хранение данных в куче - когда данные слишком велики для стека
- Рекурсивные структуры данных - когда размер типа неизвестен на этапе компиляции
- Трейт-объекты - для динамической диспетчеризации
Примеры использования:
1. Базовое использование (как в вашем примере)
fn main() { let b = Box::new(5); // i32 хранится в куче println!("b = {}", b); // Автоматическое разыменование println!("*b = {}", *b); // Явное разыменование }
2. Рекурсивные структуры данных
#[derive(Debug)] enum List { Cons(i32, Box<List>), Nil, } fn main() { let list = List::Cons(1, Box::new(List::Cons(2, Box::new(List::Nil)))); println!("{:?}", list); }
3. Большие структуры данных
struct BigData { data: [u8; 1000000], // 1MB данных - слишком много для стека } fn main() { let big_box = Box::new(BigData { data: [0; 1000000] }); // Данные хранятся в куче, избегая переполнения стека }
4. Трейт-объекты
trait Animal { fn speak(&self); } struct Dog; struct Cat; impl Animal for Dog { fn speak(&self) { println!("Woof!"); } } impl Animal for Cat { fn speak(&self) { println!("Meow!"); } } fn main() { let animals: Vec<Box<dyn Animal>> = vec![ Box::new(Dog), Box::new(Cat), ]; for animal in animals { animal.speak(); } }
Ключевые особенности:
- Владение -
Boxвладеет данными в куче - Автоматическое освобождение - память освобождается при выходе из области видимости
- Нулевая стоимость - в runtime
Boxведет себя как обычная ссылка - Безопасность - гарантии владения и заимствования Rust