rustreference-counting

When to use Rc vs Box?


I have the following code which uses both Rc and Box; what is the difference between those? Which one is better?

use std::rc::Rc;

fn main() {
    let a = Box::new(1);
    let a1 = &a;
    let a2 = &a;
    let b = Rc::new(1);
    let b1 = b.clone();
    let b2 = b.clone();

    println!("{} {}", a1, a2); //=> 1 1
    println!("{} {}", b1, b2); //=> 1 1
}

playground link


Solution

  • Rc provides shared ownership so by default its contents can't be mutated, while Box provides exclusive ownership and thus mutation is allowed:

    use std::rc::Rc;
    
    fn main() {
        let mut a = Box::new(1);
        let mut b = Rc::new(1);
    
        *a = 2; // works
        *b = 2; // doesn't
    }
    

    In addition Rc cannot be sent between threads, because it doesn't implement Send.

    The bottom line is they are meant for different things: if you don't need shared access, use Box; otherwise, use Rc (or Arc for multi-threaded shared usage) and keep in mind you will be needing Cell or RefCell for internal mutability.