Does comment on Rc<T>.as_ptr() imply Rc<T> is always pinned?

Hi Folks,

I found comments in Rc<T>.as_ptr() mentioned:

The pointer is valid for as long there are strong counts in the Rc.

Does that mean the value held by Rc will never be moved? If so does Rc<T> is equivalent to Pin<Rc<T>>? Also, how is that related to Rc.pin() method?

Thanks for any explanations!

1 Like

Rc is not pinned (without Pin<Rc>) because of Rc::as_mut and Rc::make_mut, which give you access to &mut T, which breaks pinning guarantees (allows access to mem::swap).

No. That means the value held by Rc will never be invalid, but it may not be the same - i.e., the pointer acquired via as_ptr will always point on some T (as long as there's at least one Rc alive), but non necessarily on the same T it pointed at the moment of creation.

Whether Rc::as_ptr provides sufficient pinning guarantees for your use-case depends on how it is used. The other comments give some examples for how the value in the Rc might get swapped, so if arbitrary safe user-code has access to the Rc, then you can't expect the value to not get swapped out. However, if your code doesn't give out the Rc to user-code, and you don't call make_mut yourself, then yes, the value will stay put and relying on that in unsafe code is perfectly fine.