介绍

本系列录制的视频主要放在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相关推荐

  1. 033 Rust死灵书之重构Vec

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...

  2. 030 Rust死灵书之让Vec支持slice

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...

  3. 027 Rust死灵书之Vec内存分配

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source V ...

  4. 035 Rust死灵书之Vec处理零尺寸类型

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...

  5. 032 Rust死灵书之Vec的IntoIter

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...

  6. 029 Rust死灵书之Vec实现Drop

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...

  7. 036 Rust死灵书之Vec的完整代码测试

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...

  8. 028 Rust死灵书之Vec的push和pop

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source V ...

  9. 031 Rust死灵书之Vec实现insert和remove

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...

最新文章

  1. 用VS2005打开一个.NET2.0方案,里面有几个工程和一个网站,提示网站的项目.csproj文件无法打开:“此安装不支持该项目类型”,的解决办法。...
  2. python namedtuple用法_Python namedtuple(命名元组)使用实例
  3. Leaflet中获取两个地理坐标点之间的距离
  4. SSH HTTPS 公钥、秘钥、对称加密、非对称加密、 总结理解
  5. sublime 消除锯齿_如何在Sublime中消除麻烦
  6. echarts 折线上写数值_前端ECharts数据可视化图表案例与介绍
  7. JAVA的StringBuffer类详解
  8. 由于找不到Qt5widgets.dll,无法继续执行代码。重新安装程序可能会解决此问题。
  9. 如何在一家大公司里受到重用
  10. 小程序源码:微信零钱模拟器
  11. 99%网赚精准引流技巧!
  12. 谈谈登录注册的如何实现
  13. PS教程:用PS滤镜将人物照转成素描肖像
  14. 新冠病毒核酸检测点建模分析
  15. 20个专业H5(HTML5)动画工具推荐
  16. java 切换系统输入法,Android7.0更换系统默认输入法
  17. 零点城市社交电商v2.1.8.0
  18. pdf提取其中一页,怎么实现?
  19. 首届“中科杯”全国软件设计大赛拉开帷幕
  20. “互联网+”谋定新业态-李玉庭:经信研究重整消费升级

热门文章

  1. 预渲染与服务端渲染的区别
  2. 单片机方案|口袋秤芯片方案
  3. linux 内存 内核参数详解,linux系统内核参数说明
  4. 人形机器人视觉处理——定位抓取
  5. macOS微信客户端插件,支持免认证登录、多账号登录以及防撤回
  6. 计算机网络相关的课程设计题目,计算机网络课程设计专业论文题目 计算机网络课程设计专业论文题目怎么拟...
  7. B2C网站建设的要点分析
  8. android view设置按钮颜色_建议收藏!最全 Android 常用开源库总结!
  9. 计算机音乐作曲排名2019,2019全球歌曲排行榜_数据 2019全球古典音乐排行榜
  10. 基于网页网站在线视频点播系统 毕业设计毕设源码毕业论文开题报告参考(2)网站功能