Rust - Pin | Unpin | PhantomPinned
一、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相关推荐
- 基于Rust和BPF技术的网络TCP水印
网络水印用于防DDoS攻击和网络流量等安全领域,原理是给报文增加特征信息,基于TCP options的增加字段不会被防火墙等修改去除,本文正是使用BPF和Rust来达到高效的实现的具体描述.1 源码参 ...
- Mac上Homebrew的使用
0 Homebrew是啥? "Homebrew installs the stuff you need that Apple didn't.--Homebrew 使 OS X 更完整&quo ...
- Win10开始菜单中的天气不更新问题的解决方法
两台电脑同时做的Win10系统,最新的1703 Creator Update 版本,其中一台的开始菜单中天气方块总是显示图标,试了各种方法都不行,最后是点开天气App,在App的顶端有几个按钮,其中有 ...
- ExtJs2.0学习系列--Ext.Panel
ExtJs2.0学习系列--Ext.Panel 2008-06-29 12:59 上一篇文章ExtJs2.0学习系列(1)--Ext.MessageBox ,受到了大家的褒贬不一,还是有的朋友提出好的 ...
- Android Binder 分析——匿名共享内存(Ashmem)
前面分析了 binder 中用来打包.传递数据的 Parcel,一般用来传递 IPC 中的小型参数和返回值.binder 目前每个进程 mmap 接收数据的内存是 1M,所以就算你不考虑效率问题用 P ...
- mac homebrew
brew 全称Homebrew 是Mac OSX上的软件包管理工具 Homebrew 安装和卸载工具 只用一行命令就能完成 官方地址: http://brew.sh/index.html ma ...
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6664554 在上一文章Android系统匿名共 ...
- Mac上Homebrew的使用 (Homebrew 使 OS X 更完整)
0 Homebrew是啥? "Homebrew installs the stuff you need that Apple didn't.--Homebrew 使 OS X 更完整&quo ...
- OpenCL memory object 之 Global memory (2)
当我们用clCreateBuffer, clCreateImage创建OpenCL memory object时候,我们需要输入一个flag参数,这个参数决定memory object的位置. cl_ ...
- Homebrew命令详解
#. 描述 Homebrew is the easiest and most flexible way to install the UNIX tools Apple didn't include w ...
最新文章
- perl 对ENV环境变量的使用
- 允许使用抽象类类型 isearchboxinfo 的对象_Java面向对象编程三大特征 - 多态
- 自从掌握了Selenium自动化测试框架设计,我在公司都横着走!
- Node.js 教程
- 360能卸载oracle,如何完全卸载Oracle
- cad高程如何提取到cass软件_从CAD平面图中提取坐标生成数据表
- 「SF图片上传不清晰」解决方案
- Dr.Cleaner pro for mac(系统清理和优化软件)
- Angular实现购物车计算
- 计算机与科学a,[第一单元] 计算机与计算机科学-课文A参考译文
- 3dmax 2015破解步骤
- 电子通讯录(自存储)
- java实现 腾讯人机验证 + 前端
- ESP32S2片外PSRAM的使用
- 大型在线实时应用解决方案
- RBF神经网络简单介绍与MATLAB实现
- 【区块链与密码学】第9-4讲:基于PKI的群签名算法 I
- Android实现真正的344格式化手机号码输入框
- KMS服务搭建及客户端命令
- 用python绘图竹子turtle_Python——蟒蛇图形绘制(turtle绘图体系)