15|数据结构:这些浓眉大眼的结构竟然都是智能指针?
该思维导图由 AI 生成,仅供参考
智能指针
- 深入了解
- 翻译
- 解释
- 总结
Rust语言的智能指针类型和内存管理是该文章的重点。文章深入探讨了Box<T>、Rc<T>和Arc<T>等智能指针的实现方式和应用场景,特别关注了在堆上创建内存的Box<T>、提供写时克隆的Cow<'a, B>,以及用于数据加锁的MutexGuard<T>。读者通过学习本文,不仅能更好地理解智能指针的概念和原理,还能在实际应用中构建自己的智能指针来解决问题。此外,文章还介绍了如何实现自定义的智能指针,以及内存分配器的实现和内存分配释放的注意事项。对于对Rust语言和内存管理感兴趣的读者来说,本文内容丰富,值得一读。
《陈天 · Rust 编程第一课》,新⼈⾸单¥68
全部留言(31)
- 最新
- 精选
- GengTeng1. impl From<String> for MyString { fn from(s: String) -> Self { if s.len() > MINI_STRING_MAX_LEN { Self::Standard(s) } else { Self::Inline(MiniString::new(s)) } } } 2. impl MyString { fn push_str(&mut self, string: &str) { match self { MyString::Inline(m) => { let l = m.len(); let len = l + string.len(); if len > MINI_STRING_MAX_LEN { *self = Self::Standard(m.to_string() + string); } else { m.data[l..].copy_from_slice(string.as_bytes()); m.len = len as u8; } } MyString::Standard(s) => s.push_str(string), } } } 3. 32 32 Cow<'a, B> 要求 B 实现 ToOwned,其Owned变体的数据为 对应的 Owned 类型,即 [T] 对应的是 Vec<T>, str 对应的是 String,这两个的大小都是24字节,加上枚举占用的一字节以及8字节对齐,就是32字节。
作者回复: 非常棒!第 1 题还可以用泛型参数进一步统一 String/&str,DRY: ```Rust impl<T> From<T> for MyString where T: AsRef<str> + Into<String>, { fn from(s: T) -> Self { match s.as_ref().len() > MINI_STRING_MAX_LEN { true => Self::Standard(s.into()), _ => Self::Inline(MiniString::new(s)), } } } ```
2021-09-27417 - Lucas跟不上了 看不懂了😭
作者回复: 加油!对暂时理解不了的地方,可以先跳过,之后再回来阅读
2021-10-1157 - 记事本Owned(<B as ToOwned>::Owned) 泛型B转换特征名称是个什么样的语法,老师
作者回复: as 是 Rust 的关键字,用于做类型转换,比如: let i = 1; // i32 let u = i as usize; // usize 这里 B 有约束是 B: ToOwned,所以 B as ToOwned 是成立的,相当于把 B 转换成 ToOwned,然后因为 ToOwned 带有关联类型,所以强制转换成 ToOwend 后,引用它的关联类型 Owned。
2021-09-2725 - 记事本String在堆上分配内存,String是栈上的一个结构体,假如Box::new(String),是不是String结构体也在堆上了
作者回复: 对的。
2021-10-163 - 沈畅课程学到这,最大的问题感觉不成体系,每篇文章像是博客专题文章。但是章节之间没有体系,作为第一课感觉有些不妥。
编辑回复: 恩简单说明一下前面的课程设计思路: -前置篇是编程相关的最基本概念 -基础篇是开始接触Rust,语法介绍了1讲,然后插入了get hands dirty 项目从写代码中直观感受Rust语法特性,然后就讲几个Rust的学习重难点了:所有权、生命周期、函数式编程特性、类型系统、泛型编程、错误处理等 作为“第一课”,语法讲的不是很多确实不够友好,一是课程篇幅有限,二是Rust的官方文档做的非常好,另外也有老师个人倾向觉得语法详细讲没有太大必要,毕竟再怎么样讲,也得学习者自己敲代码上手慢慢熟悉风格。 所以可能没有给你非常好的学习体验,表示抱歉。 你可以配合官方的Rust book一起使用,另外加餐中老师和几个同学也分享了自己的学习资料,祝学习愉快~
2022-07-2122 - 核桃关于所有权和智能指针的理解,可以看看这篇文章 https://zhuanlan.zhihu.com/p/54078587 这些概念在c++里面都是有的,因此从c++的角度去理解一下智能指针与普通指针区别,什么是移动语义,那样返回来看rust的概念,就明白清晰很多了。
作者回复: 👍
2021-12-052 - Ryan这样实现出来的MyString如果传递给另一个线程,内部栈上的内存可能被释放了。这方面与标准String的区别是如何体现并加以保证的呢?
作者回复: 在线程间传递栈上的有所有权的数据会 move,所以不会有问题。
2021-10-302 - Mr_李冲文中Cow部分示例段Url::parse有个bug,url左右两边各有个尖括号,需要去掉,否则会解析url失败,unwrap后导致程序崩溃。 更正后是下面这个: let url = Url::parse("https://tyr.com/rust?page=1024&sort=desc&extra=hello%20world").unwrap();
作者回复: 多谢指正!估计是代码粘到文档中的问题,我让编辑修改了。github 上的代码是正确的。
2021-12-261 - yg陈老师您好,用rust编写内核模块的话,哪里有资料可以参考么
作者回复: 可以参考:https://github.com/Rust-for-Linux/linux/tree/rust/Documentation/rust
2021-11-301 - Ryan我感觉这课程得至少刷3遍才能看懂,已经跟不上了。。。
作者回复: 慢慢来,别急
2021-11-071