I found comments in
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
Thanks for any explanations!
Rc is not pinned (without
Pin<Rc>) because of
Rc::make_mut, which give you access to
&mut T, which breaks pinning guarantees (allows access to
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.
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.