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

本文没有什么需要特别详细阐述的内容,基本都是一些基础性的概念和一些空洞的定义。

一、基本概念

指针 -拥有一个指向一个堆数据的地址的变量。本身是变量,但其数据就是一个地址

智能指针-一种特别的指针(也是变量),除了指向数据的地址,通常还具有元数据其它功能

  • 智能指针通常使用结构体实现。智能指针不同于结构体的地方在于其实现了 DerefDrop 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,至于额外功能不用说了,为了节约篇幅,并没有贴上关联的方法和特质代码。

 

三、智能指针的作用

为什么要定义智能指针,直接用普通的指针不行吗?

结论是,可以用普通指针,但是如果那样,编码会很痛苦。在以下场景中,智能指针有用的:

  1. 定义递归数据
  2. 辅助实现多线程
  3. 简化内存管理

这是目前,我个人认为智能指针的最主要作用,归纳起来其实就是一个:方便编码

如果没有智能指针,那么实现以上三个目的恐怕比较麻烦,尤其是在rust这样的环境中。

以上2,3两点现在只有粗浅的认知,后面会补充有关资料。

作为初学者,如果不能深刻体会这些也是极其正常的。

总之记住:你可以不用智能指针,但是最好还是要用下。看看String,Vec都是智能指针,还有什么不用的理由?

四、小结

rust一直宣称内存安全。但内存安全不代表不使用指针。

当遵循某些规范之后,它们也可以被安全使用。

具体到现实,作为指针的一种,智能指针在rust中大放光芒。

智能指针结合rust的所有权原则,可以避免C++那样可怕指针问题。

智能指针要点三:变量、元数据、额外的功能

其中额外的功能,基于个人理解,主要实现两类功能:处理所有权、其它业务功能

 

posted @   正在战斗中  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)
点击右上角即可分享
微信分享提示