一、Pin<T> 是一种可以固定住内存地址的容器。

主要是解决自引用结构体问题,比如一个struct有一个T字段和一个&T字段,彼此有借用关系,当struct被移动后,&T就会成为悬垂指针。使用Pin套娃一层后,不管Pin<T>怎么移动,都不会影响&T。

  • Pin::new():创建一个Pin<T>的套娃
  • Box::pin():创建一个Pin<Box<T>>的套娃

二、Unpin 是Pin的反操作,基本上所有的类型都实现了Unpin,表示是可以随意移动的。

如果想让Unpin变为Pinned,则可以使用marker:PhantomPinned

三、任何T,只要实现了Unpin,那么Pin<Box<T>>Box<T>是没有区别的,Pin<&mut T>也一样。

示例:

use std::ops::Deref;
use std::ptr::NonNull;
use std::marker::PhantomPinned;
use std::pin::Pin;struct Unmovable {data: String,slice: NonNull<String>,_pin: PhantomPinned,
}impl Unpin for Unmovable {}impl Unmovable {fn new(data: String) -> Pin<Box<Self>> {let res = Unmovable {data,slice: NonNull::dangling(),_pin: PhantomPinned,};let mut boxed = Box::pin(res);let slice = NonNull::from(&boxed.data);unsafe {let mut_ref: Pin<&mut Self> = Pin::as_mut(&mut boxed);Pin::get_unchecked_mut(mut_ref).slice = slice;}boxed}
}fn main() {let unmoved = Unmovable::new("hello".to_string());let mut still_unmoved = unmoved;let mut new_unmoved = Unmovable::new("world".to_string());std::mem::swap(&mut *still_unmoved, &mut *new_unmoved);
}

PS:new方法创建了一个Pinned的结构体,如果它没有实现Unpin,那么最后一步swap是操作不了的。

Rust - Pin | Unpin | PhantomPinned相关推荐

  1. 基于Rust和BPF技术的网络TCP水印

    网络水印用于防DDoS攻击和网络流量等安全领域,原理是给报文增加特征信息,基于TCP options的增加字段不会被防火墙等修改去除,本文正是使用BPF和Rust来达到高效的实现的具体描述.1 源码参 ...

  2. Mac上Homebrew的使用

    0 Homebrew是啥? "Homebrew installs the stuff you need that Apple didn't.--Homebrew 使 OS X 更完整&quo ...

  3. Win10开始菜单中的天气不更新问题的解决方法

    两台电脑同时做的Win10系统,最新的1703 Creator Update 版本,其中一台的开始菜单中天气方块总是显示图标,试了各种方法都不行,最后是点开天气App,在App的顶端有几个按钮,其中有 ...

  4. ExtJs2.0学习系列--Ext.Panel

    ExtJs2.0学习系列--Ext.Panel 2008-06-29 12:59 上一篇文章ExtJs2.0学习系列(1)--Ext.MessageBox ,受到了大家的褒贬不一,还是有的朋友提出好的 ...

  5. Android Binder 分析——匿名共享内存(Ashmem)

    前面分析了 binder 中用来打包.传递数据的 Parcel,一般用来传递 IPC 中的小型参数和返回值.binder 目前每个进程 mmap 接收数据的内存是 1M,所以就算你不考虑效率问题用 P ...

  6. mac homebrew

    brew 全称Homebrew  是Mac OSX上的软件包管理工具 Homebrew 安装和卸载工具 只用一行命令就能完成 官方地址:    http://brew.sh/index.html ma ...

  7. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6664554 在上一文章Android系统匿名共 ...

  8. Mac上Homebrew的使用 (Homebrew 使 OS X 更完整)

    0 Homebrew是啥? "Homebrew installs the stuff you need that Apple didn't.--Homebrew 使 OS X 更完整&quo ...

  9. OpenCL memory object 之 Global memory (2)

    当我们用clCreateBuffer, clCreateImage创建OpenCL memory object时候,我们需要输入一个flag参数,这个参数决定memory object的位置. cl_ ...

  10. Homebrew命令详解

    #. 描述 Homebrew is the easiest and most flexible way to install the UNIX tools Apple didn't include w ...

最新文章

  1. perl 对ENV环境变量的使用
  2. 允许使用抽象类类型 isearchboxinfo 的对象_Java面向对象编程三大特征 - 多态
  3. 自从掌握了Selenium自动化测试框架设计,我在公司都横着走!
  4. Node.js 教程
  5. 360能卸载oracle,如何完全卸载Oracle
  6. cad高程如何提取到cass软件_从CAD平面图中提取坐标生成数据表
  7. 「SF图片上传不清晰」解决方案
  8. Dr.Cleaner pro for mac(系统清理和优化软件)
  9. Angular实现购物车计算
  10. 计算机与科学a,[第一单元] 计算机与计算机科学-课文A参考译文
  11. 3dmax 2015破解步骤
  12. 电子通讯录(自存储)
  13. java实现 腾讯人机验证 + 前端
  14. ESP32S2片外PSRAM的使用
  15. 大型在线实时应用解决方案
  16. RBF神经网络简单介绍与MATLAB实现
  17. 【区块链与密码学】第9-4讲:基于PKI的群签名算法 I
  18. Android实现真正的344格式化手机号码输入框
  19. KMS服务搭建及客户端命令
  20. 用python绘图竹子turtle_Python——蟒蛇图形绘制(turtle绘图体系)

热门文章

  1. 负载均衡器ribbon和LoadBalancer
  2. 服务器文件异地备份,云服务器需要异地备份吗
  3. 经济寒冬之后,是人工智能的春天
  4. 一文看懂Java锁机制,看了都说好!
  5. 前端扁平化数据转树形数据_javascript将扁平的数据转为树形结构的几种方法
  6. 飞思卡尔系列单片机的censorship的使用
  7. The day that you see me old
  8. echoServer回显服务器
  9. 抽象代数之三次方程的求根公式和构造一类整系数三次方程
  10. 2018天津大学夏令营机试第二题