rust 笔记 5:Pin 相关知识(极简总结版)
  1. Pin 是一个结构 struct,Unpin 是一个特征 trait。

  2. Pin 结构体的唯一成员是一个指针(例如引用和 Box)。它禁止外界获取指向数据的可变引用,从而保证指向的数据不被移动

  3. Unpin 代表数据可以被安全地移动!Unpin 则反之。通常 !Unpin 的都是自引用类型。

  4. 可以通过引入一个 std::marker::PhantomPinned 成员来为结构体实现 !Unpin。这个标记类型本身是 !Unpin 的,一旦结构体包含了 !Unpin 成员,那么整个结构体就会是 !Unpin

  5. 只有当存放的数据是 !Unpin 类型指针时,Pin 的特性才会生效。如果一个 Unpin 类型的指针被放入 Pin 中,则这个操作是没有实际意义的,Pin 也不会阻止数据移动。在这种情况下 Pin<&mut u8>&mut u8 几乎没有区别。

  6. async 函数返回的 Future 默认就是 !Unpin 的,但是很多时候我们需要一个 Unpin 的 Future。解决方法是将 Future 通过 <Box> 固定到堆上,就能是 Unpin 了,再通过 Pin 保证其不被移动,即最终获取一个 Pin<Box<Future>>

    例如常见的约束可能是:

    fn execute_unpin_future(x: impl Future + Unpin) {/* ... */ }

    那么 Pin<Box<Fut>> 即满足了 impl Future,又能实现 Unpin.

  7. 也可以 Pin 到栈上,但是除非是 Unpin的类型,否则就必须使用 unsafe(Pin::new_unchecked or std::pin::pin!)。此外,函数返回时栈帧会释放,而且 rust 编译优化可能会在栈帧内移动数据。因此,尽量不要这么做。

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇