Box = exclusive ownership, heap allocation, no runtime overhead. Rc = shared ownership, heap allocation, reference counting overhead. Box for one owner; Rc for many.
Box — single owner:
1let big_data = Box::new([0u8; 1024]);2let moved = big_data; // Move, not copy3println!("Size: {}", moved.len()); // 10244// big_data is invalid here
Rc — shared ownership:
1use std::rc::Rc;23struct SharedResource {4 name: String,5 data: Vec<u8>,6}78let resource = Rc::new(SharedResource {9 name: "shared".into(),10 data: vec![1, 2, 3],11});1213let worker1 = Rc::clone(&resource);14let worker2 = Rc::clone(&resource);1516println!("{}: {:?}", worker1.name, worker1.data);17println!("Refs: {}", Rc::strong_count(&resource)); // 3
When to use Box:
When to use Rc:
Common mistakes: