026 Rust死灵书之实现Vec
介绍
本系列录制的视频主要放在B站上Rust死灵书学习视频
Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source
从本节开始,我们用我们在Rust死灵书中学到的知识实现一个Vec。
MyVec的初始定义
我们的Vec的定义只要这样就可以了:
pub Struct MyVec<T> {ptr: *mut T,cap: usize,len: usize,
}
如此定义的问题: 我们此处使用的裸指针ptr其实是想达到可变引用的效果,从安全的角度,不应该有别名,或者通俗一点说,此处我们应该锁定它的内容和owner。
因此,我们定义一个Unique类型,让裸指针拥有数据。
优化的Vec定义
Uninque类型定义
Unique类型应该满足的条件:
- 对T可变;
- 拥有类型T的值(用于drop检查);
- 如果T是Send/Sync,那Unique就也是Send/Sync的;
- 指针永远不为null。
可能的Unique定义如下:
use std::marker::PhantomData;//1、结构体的定义满足前两点
struct Unique<T> {ptr: *const T, //指针不可变,指针指向的内容可变_marker: PhantomData<T>, //用于drop检查,如果不加,编译器会认为,结构体没有拥有类型T,调不调用析构函数都无所谓
}//2、满足第三点
unsafe impl<T: Send> Send for Unique<T> {}
unsafe impl<T: Sync> Sync for Unique<T> {}impl<T> Unique<T> {const unsafe fn new_unchecked(ptr: *mut T) -> Self {unsafe { Unique { ptr: ptr, _marker: PhantomData} }}//3、满足第四点fn new(ptr: *mut T) -> Option<Self> {if !ptr.is_null() {Some(unsafe { Unique { ptr: ptr, _marker: PhantomData} })} else {None}}fn as_ptr(&self) -> *mut T {self.ptr as *mut T}
}
新的Vec定义
pub struct MyVec<T> {//ptr: *mut T,ptr: Unique<T>,cap: usize,len: usize,
}
026 Rust死灵书之实现Vec相关推荐
- 033 Rust死灵书之重构Vec
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...
- 030 Rust死灵书之让Vec支持slice
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...
- 027 Rust死灵书之Vec内存分配
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source V ...
- 035 Rust死灵书之Vec处理零尺寸类型
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...
- 032 Rust死灵书之Vec的IntoIter
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...
- 029 Rust死灵书之Vec实现Drop
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...
- 036 Rust死灵书之Vec的完整代码测试
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...
- 028 Rust死灵书之Vec的push和pop
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source V ...
- 031 Rust死灵书之Vec实现insert和remove
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...
最新文章
- 用VS2005打开一个.NET2.0方案,里面有几个工程和一个网站,提示网站的项目.csproj文件无法打开:“此安装不支持该项目类型”,的解决办法。...
- python namedtuple用法_Python namedtuple(命名元组)使用实例
- Leaflet中获取两个地理坐标点之间的距离
- SSH HTTPS 公钥、秘钥、对称加密、非对称加密、 总结理解
- sublime 消除锯齿_如何在Sublime中消除麻烦
- echarts 折线上写数值_前端ECharts数据可视化图表案例与介绍
- JAVA的StringBuffer类详解
- 由于找不到Qt5widgets.dll,无法继续执行代码。重新安装程序可能会解决此问题。
- 如何在一家大公司里受到重用
- 小程序源码:微信零钱模拟器
- 99%网赚精准引流技巧!
- 谈谈登录注册的如何实现
- PS教程:用PS滤镜将人物照转成素描肖像
- 新冠病毒核酸检测点建模分析
- 20个专业H5(HTML5)动画工具推荐
- java 切换系统输入法,Android7.0更换系统默认输入法
- 零点城市社交电商v2.1.8.0
- pdf提取其中一页,怎么实现?
- 首届“中科杯”全国软件设计大赛拉开帷幕
- “互联网+”谋定新业态-李玉庭:经信研究重整消费升级
热门文章
- 预渲染与服务端渲染的区别
- 单片机方案|口袋秤芯片方案
- linux 内存 内核参数详解,linux系统内核参数说明
- 人形机器人视觉处理——定位抓取
- macOS微信客户端插件,支持免认证登录、多账号登录以及防撤回
- 计算机网络相关的课程设计题目,计算机网络课程设计专业论文题目 计算机网络课程设计专业论文题目怎么拟...
- B2C网站建设的要点分析
- android view设置按钮颜色_建议收藏!最全 Android 常用开源库总结!
- 计算机音乐作曲排名2019,2019全球歌曲排行榜_数据 2019全球古典音乐排行榜
- 基于网页网站在线视频点播系统 毕业设计毕设源码毕业论文开题报告参考(2)网站功能