028 Rust死灵书之Vec的push和pop
介绍
本系列录制的视频主要放在B站上Rust死灵书学习视频
Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source
Vec的push和pop
本节给MyVec实现push和pop方法,完整代码如下:
#![feature(ptr_internals)]
use std::mem;
use std::alloc::{alloc, realloc, Layout, handle_alloc_error};
use std::ptr::{Unique, self};pub struct MyVec<T> {ptr: Unique<T>,cap: usize,len: usize,
}impl<T> MyVec<T> {fn new() -> Self {assert!(mem::size_of::<T>() != 0, "还没准备好处理零尺寸类型");MyVec { ptr: Unique::dangling(), len: 0, cap: 0 }}fn grow(&mut self) {unsafe {let align = mem::align_of::<T>();let elem_size = mem::size_of::<T>();let layout: Layout;let (new_cap, ptr) = if self.cap == 0 {layout = Layout::from_size_align_unchecked(elem_size, align);let ptr = alloc(layout);(1, ptr)} else {let new_cap = self.cap * 2;let old_num_bytes = self.cap * elem_size;assert!(old_num_bytes <= (isize::MAX as usize) / 2,"capacity overflow");let new_num_bytes = old_num_bytes * 2;layout = Layout::from_size_align_unchecked(new_num_bytes, align);let ptr = realloc(self.ptr.as_ptr() as *mut _,layout,new_num_bytes);(new_cap, ptr)};if ptr.is_null() { handle_alloc_error(layout); }if let Some(ptr) = Unique::new(ptr as *mut _) {self.ptr = ptr;} else {panic!("error!");}self.cap = new_cap;}}fn push(&mut self, elem: T) {if self.len == self.cap { self.grow(); }//关键点在于要直接覆盖,因为不知道内存之前是否有东西unsafe {ptr::write(self.ptr.as_ptr().offset(self.len as isize), elem);}self.len += 1;}pub fn pop(&mut self) -> Option<T> {if self.len == 0 {None} else {self.len -= 1;unsafe { Some(ptr::read(self.ptr.as_ptr().offset(self.len as isize)))}}}
}fn main() {let mut vec: MyVec<i32> = MyVec::new();vec.push(8);if let Some(v) = vec.pop() {println!("v == {}", v);}println!("Hello, world!");
}
关键点说明:
实现pop的时候,需要对内存直接写入。
028 Rust死灵书之Vec的push和pop相关推荐
- 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 详 ...
- 031 Rust死灵书之Vec实现insert和remove
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...
- 027 Rust死灵书之Vec内存分配
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source V ...
- 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 详 ...
- 026 Rust死灵书之实现Vec
介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 从 ...
最新文章
- 中层管理者,你到底怎样管理?
- Nominal data 与Ordinal data区别
- list array解析(总算清楚一点了)
- Binary String Reconstruction CodeForces - 1352F(思维+构造)
- 538B. Quasi Binary
- 阿里投资小鹏汽车,是提速自动驾驶布局的开端吗?
- 2021-04-06梦笔记
- HyperLPR车牌识别代码解读
- java thrift 教程_RPC学习----Thrift快速入门和Java简单示例
- linux 火狐打不开网页视频,Ubuntu下Firefox不能播放html视频的问题
- DIY年轻人的第一辆电动滑板车
- 计算机光驱启动设置,bios设置光驱启动图文教程
- 个人网站、个人博客的设计案例,仅供参考
- 印前调色的基本规律及视觉效果
- Asp.Net MVC4.0 官方教程 入门指南之八--为Movie模型和库表添加字段
- WeQuant交易策略—EMV
- 第四周项目3单链表应用(2)
- 不知道怎么识别手写文字?快来看这些手写文字识别成文档软件
- 促进目标实现的激励技巧
- 从零开始搭建自己的网站可外网访问从购买服务器开始