陈天 · Rust 编程第一课
陈天
Tubi TV 研发副总裁
23195 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
基础篇 (21讲)
陈天 · Rust 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

15|数据结构:这些浓眉大眼的结构竟然都是智能指针?

参考资料
实现自己的智能指针
MutexGuard
Cow<'a, B>
Box
智能指针
指针与引用
数据结构:智能指针

该思维导图由 AI 生成,仅供参考

你好,我是陈天。
到现在为止我们学了 Rust 的所有权与生命周期、内存管理以及类型系统,基础知识里还剩一块版图没有涉及:数据结构,数据结构里最容易让人困惑的就是智能指针,所以今天我们就来解决这个难点。
我们之前简单介绍过指针,这里还是先回顾一下:指针是一个持有内存地址的值,可以通过解引用来访问它指向的内存地址,理论上可以解引用到任意数据类型;引用是一个特殊的指针,它的解引用访问是受限的,只能解引用到它引用数据的类型,不能用作它用。
那什么是智能指针呢?

智能指针

在指针和引用的基础上,Rust 偷师 C++,提供了智能指针。智能指针是一个表现行为很像指针的数据结构,但除了指向数据的指针外,它还有元数据以提供额外的处理能力。
这个定义有点模糊,我们对比其他的数据结构来明确一下。
你有没有觉得很像之前讲的胖指针。智能指针一定是一个胖指针,但胖指针不一定是一个智能指针。比如 &str 就只是一个胖指针,它有指向堆内存字符串的指针,同时还有关于字符串长度的元数据。
我们看智能指针 String 和 &str 的区别:
从图上可以看到,String 除了多一个 capacity 字段,似乎也没有什么特殊。但 String 对堆上的值有所有权,而 &str 是没有所有权的,这是 Rust 中智能指针和普通胖指针的区别
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Rust语言的智能指针类型和内存管理是该文章的重点。文章深入探讨了Box<T>、Rc<T>和Arc<T>等智能指针的实现方式和应用场景,特别关注了在堆上创建内存的Box<T>、提供写时克隆的Cow<'a, B>,以及用于数据加锁的MutexGuard<T>。读者通过学习本文,不仅能更好地理解智能指针的概念和原理,还能在实际应用中构建自己的智能指针来解决问题。此外,文章还介绍了如何实现自定义的智能指针,以及内存分配器的实现和内存分配释放的注意事项。对于对Rust语言和内存管理感兴趣的读者来说,本文内容丰富,值得一读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《陈天 · Rust 编程第一课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(31)

  • 最新
  • 精选
  • GengTeng
    1. 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-27
    4
    17
  • Lucas
    跟不上了 看不懂了😭

    作者回复: 加油!对暂时理解不了的地方,可以先跳过,之后再回来阅读

    2021-10-11
    5
    7
  • 记事本
    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-27
    2
    5
  • 记事本
    String在堆上分配内存,String是栈上的一个结构体,假如Box::new(String),是不是String结构体也在堆上了

    作者回复: 对的。

    2021-10-16
    3
  • 沈畅
    课程学到这,最大的问题感觉不成体系,每篇文章像是博客专题文章。但是章节之间没有体系,作为第一课感觉有些不妥。

    编辑回复: 恩简单说明一下前面的课程设计思路: -前置篇是编程相关的最基本概念 -基础篇是开始接触Rust,语法介绍了1讲,然后插入了get hands dirty 项目从写代码中直观感受Rust语法特性,然后就讲几个Rust的学习重难点了:所有权、生命周期、函数式编程特性、类型系统、泛型编程、错误处理等 作为“第一课”,语法讲的不是很多确实不够友好,一是课程篇幅有限,二是Rust的官方文档做的非常好,另外也有老师个人倾向觉得语法详细讲没有太大必要,毕竟再怎么样讲,也得学习者自己敲代码上手慢慢熟悉风格。 所以可能没有给你非常好的学习体验,表示抱歉。 你可以配合官方的Rust book一起使用,另外加餐中老师和几个同学也分享了自己的学习资料,祝学习愉快~

    2022-07-21
    2
    2
  • 核桃
    关于所有权和智能指针的理解,可以看看这篇文章 https://zhuanlan.zhihu.com/p/54078587 这些概念在c++里面都是有的,因此从c++的角度去理解一下智能指针与普通指针区别,什么是移动语义,那样返回来看rust的概念,就明白清晰很多了。

    作者回复: 👍

    2021-12-05
    2
  • Ryan
    这样实现出来的MyString如果传递给另一个线程,内部栈上的内存可能被释放了。这方面与标准String的区别是如何体现并加以保证的呢?

    作者回复: 在线程间传递栈上的有所有权的数据会 move,所以不会有问题。

    2021-10-30
    2
  • 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-26
    1
  • yg
    陈老师您好,用rust编写内核模块的话,哪里有资料可以参考么

    作者回复: 可以参考:https://github.com/Rust-for-Linux/linux/tree/rust/Documentation/rust

    2021-11-30
    1
  • Ryan
    我感觉这课程得至少刷3遍才能看懂,已经跟不上了。。。

    作者回复: 慢慢来,别急

    2021-11-07
    1
收起评论
显示
设置
留言
31
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部