找回密码
 立即注册
首页 资源区 代码 rust学习十五.1、智能指针基本概念

rust学习十五.1、智能指针基本概念

峰埋姚 前天 15:18
本文没有什么需要特别详细阐述的内容,基本都是一些基础性的概念和一些空洞的定义。
一、基本概念

指针 -拥有一个指向一个堆数据的地址的变量。本身是变量,但其数据就是一个地址。
智能指针-一种特别的指针(也是变量),除了指向数据的地址,通常还具有元数据和其它功能。

  • 智能指针通常使用结构体实现。智能指针不同于结构体的地方在于其实现了 Deref 和 Drop trait
  • Deref trait 允许智能指针结构体实例表现的像引用一样,这样就可以编写既用于引用、又用于智能指针的代码
  • Drop trait 允许我们自定义当智能指针离开作用域时运行的代码
关于概念,大概就是这样,没有什么特别的。
二、常见的智能指针

常见的智能指针:

  • String
  • Vec
  • Box  - 盒子指针,用于在堆上分配值
  • Rc  - 引用计数指针
  • Ref  - 不可变引用指针
  • RefMut -可变引用指针
2.1关于String

我们看下String的基本定义:
  1. #[derive(PartialEq, PartialOrd, Eq, Ord)]
  2. #[stable(feature = "rust1", since = "1.0.0")]
  3. #[cfg_attr(not(test), lang = "String")]
  4. pub struct String {
  5.     vec: Vec<u8>,
  6. }
复制代码
说实话,我没有看到看到类似如下的结构:
  1. struct xxx{
  2.   meta:***
  3. }
复制代码
注:这里的"meta"指的结构拥有的元数据,不一定叫meta,可以是任意名称,表示元数据而已。***表示特定的类型
智能指针的特征:有指向数据的地址、有元数据、有额外功能
说实话,不知道为什么rust认为String是智能指针,如果有理由,大概是因为它包含了Vec,而Vec是智能指针。
当然String有额外功能。
 
2.2关于Vec
  1. #[stable(feature = "rust1", since = "1.0.0")]
  2. #[cfg_attr(not(test), rustc_diagnostic_item = "Vec")]
  3. #[rustc_insignificant_dtor]
  4. pub struct Vec<T, #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global> {
  5.     buf: RawVec<T, A>,
  6.     len: usize,
  7. }
复制代码
从这个定义看,向量比String更正规,它有额外的元数据len,至于额外功能不用说了,为了节约篇幅,并没有贴上关联的方法和特质代码。
 
三、智能指针的作用

为什么要定义智能指针,直接用普通的指针不行吗?
结论是,可以用普通指针,但是如果那样,编码会很痛苦。在以下场景中,智能指针有用的:

  • 定义递归数据
  • 辅助实现多线程
  • 简化内存管理
这是目前,我个人认为智能指针的最主要作用,归纳起来其实就是一个:方便编码
如果没有智能指针,那么实现以上三个目的恐怕比较麻烦,尤其是在rust这样的环境中。
以上2,3两点现在只有粗浅的认知,后面会补充有关资料。
作为初学者,如果不能深刻体会这些也是极其正常的。
总之记住:你可以不用智能指针,但是最好还是要用下。看看String,Vec都是智能指针,还有什么不用的理由?
四、小结

rust一直宣称内存安全。但内存安全不代表不使用指针。
当遵循某些规范之后,它们也可以被安全使用。
具体到现实,作为指针的一种,智能指针在rust中大放光芒。
智能指针结合rust的所有权原则,可以避免C++那样可怕指针问题。
智能指针要点三:变量、元数据、额外的功能
其中额外的功能,基于个人理解,主要实现两类功能:处理所有权、其它业务功能
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册