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

打印 上一主题 下一主题

主题 555|帖子 555|积分 1665

本文没有什么需要特别详细论述的内容,根本都是一些基础性的概念和一些空洞的界说。
一、根本概念

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

  • 智能指针通常利用结构体实现。智能指针差别于结构体的地方在于实在现了 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++那样可怕指针题目。
智能指针要点三:变量、元数据、额外的功能
其中额外的功能,基于个人明白,重要实现两类功能:处理全部权、其它业务功能
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表