本文没有什么需要特别详细阐述的内容,基本都是一些基础性的概念和一些空洞的定义。
一、基本概念
指针 -拥有一个指向一个堆数据的地址的变量。本身是变量,但其数据就是一个地址。
智能指针-一种特别的指针(也是变量),除了指向数据的地址,通常还具有元数据和其它功能。
- 智能指针通常使用结构体实现。智能指针不同于结构体的地方在于其实现了
Deref
和Drop
trait Deref
trait 允许智能指针结构体实例表现的像引用一样,这样就可以编写既用于引用、又用于智能指针的代码Drop
trait 允许我们自定义当智能指针离开作用域时运行的代码
关于概念,大概就是这样,没有什么特别的。
二、常见的智能指针
常见的智能指针:
- String
- Vec
Box - 盒子指针,用于在堆上分配值
Rc - 引用计数指针
Ref - 不可变引用指针
RefMut -可变引用指针
2.1关于String
我们看下String的基本定义:
#[derive(PartialEq, PartialOrd, Eq, Ord)] #[stable(feature = "rust1", since = "1.0.0")] #[cfg_attr(not(test), lang = "String")] pub struct String { vec: Vec<u8>, }
说实话,我没有看到看到类似如下的结构:
struct xxx{ meta:*** }
注:这里的"meta"指的结构拥有的元数据,不一定叫meta,可以是任意名称,表示元数据而已。***表示特定的类型
智能指针的特征:有指向数据的地址、有元数据、有额外功能
说实话,不知道为什么rust认为String是智能指针,如果有理由,大概是因为它包含了Vec,而Vec是智能指针。
当然String有额外功能。
2.2关于Vec
#[stable(feature = "rust1", since = "1.0.0")] #[cfg_attr(not(test), rustc_diagnostic_item = "Vec")] #[rustc_insignificant_dtor] pub struct Vec<T, #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global> { buf: RawVec<T, A>, len: usize, }
从这个定义看,向量比String更正规,它有额外的元数据len,至于额外功能不用说了,为了节约篇幅,并没有贴上关联的方法和特质代码。
三、智能指针的作用
为什么要定义智能指针,直接用普通的指针不行吗?
结论是,可以用普通指针,但是如果那样,编码会很痛苦。在以下场景中,智能指针有用的:
- 定义递归数据
- 辅助实现多线程
- 简化内存管理
这是目前,我个人认为智能指针的最主要作用,归纳起来其实就是一个:方便编码
如果没有智能指针,那么实现以上三个目的恐怕比较麻烦,尤其是在rust这样的环境中。
以上2,3两点现在只有粗浅的认知,后面会补充有关资料。
作为初学者,如果不能深刻体会这些也是极其正常的。
总之记住:你可以不用智能指针,但是最好还是要用下。看看String,Vec都是智能指针,还有什么不用的理由?
四、小结
rust一直宣称内存安全。但内存安全不代表不使用指针。
当遵循某些规范之后,它们也可以被安全使用。
具体到现实,作为指针的一种,智能指针在rust中大放光芒。
智能指针结合rust的所有权原则,可以避免C++那样可怕指针问题。
智能指针要点三:变量、元数据、额外的功能
其中额外的功能,基于个人理解,主要实现两类功能:处理所有权、其它业务功能
标签:String,智能,Vec,数据,基本概念,rust,指针 From: https://www.cnblogs.com/lzfhope/p/18631198