< 返回版块

fairjm 发表于 2020-05-10 14:59

Tags:rust,pin

标题起的比较诡异。。。感觉自己应该是错过了或理解错了什么概念。 之前看那个200行代码解释future的Pin那节有点懵逼

按照之前看文档对Pin作用的理解应该是阻止Pin<P<T>> P指向的T的内存位置发生变更,如果T是个struct就是整个struct的内存位置。
这个出现问题的场景是一个自引用的指针指向了结构本身,但结构内存发生变化导致指针指向了无效的区域。
而对于单个field的内容的变更是不影响整个struct的位置的。

文档里也说明了这点:

// we know this is safe because modifying a field doesn't move the whole struct
        unsafe {
            let mut_ref: Pin<&mut Self> = Pin::as_mut(&mut boxed);
            Pin::get_unchecked_mut(mut_ref).slice = slice;
        }

但Pin那节原文中使用的swap也并没有修改整个struct的地址 而是交换了field的值.
这个出现问题不是因为整个struct的内存位置变更导致指针指向了无效的地方,主要还是把指针的值给更新了.(其实就用上面那段代码也可以出现这样的问题)
这和Pin用来阻止内存位置变化的关系时什么有点不解.

以及使用了Pin且T是!Unpin的话是不能安全获取到&mut T的,那&mut T是怎样能让整个struct的内存位置发生变更的呢...
也就是这句话的具体表现:

By default, all types in Rust are movable. Rust allows passing all types by-value, and common smart-pointer types such as Box and &mut T allow replacing and moving the values they contain: you can move out of a Box, or you can use mem::swap.

也就是在什么情况下*mut T会让整个struct的内存位置变更?

评论区

写评论
作者 fairjm 2020-05-10 16:31

看了下视频 感觉理解有误 关注点不是struct本身 而是内部的pointer和原本指向的位置的关系 swap之后值的确是move了 我自己再理理 :)

1 共 1 条评论, 1 页