首页 > 其他分享 >rust学习十五.1、智能指针基本概念

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

时间:2024-12-27 14:52:30浏览次数:3  
标签:String 智能 Vec 数据 基本概念 rust 指针

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

一、基本概念

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

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

  • 智能指针通常使用结构体实现。智能指针不同于结构体的地方在于其实现了 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++那样可怕指针问题。

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

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

 

标签:String,智能,Vec,数据,基本概念,rust,指针
From: https://www.cnblogs.com/lzfhope/p/18631198

相关文章

  • 线性代数1.矩阵的基本概念&意义&特殊矩阵&基本运算
    1.矩阵的基本概念&意义&特殊矩阵&基本运算1.1矩阵的定义:矩阵是由\(m\timesn\)个数排成的数表。如以下矩阵:\[X=\begin{bmatrix}x_{11}&x_{12}&x_{13}&...&x_{1n}\\x_{21}&x_{22}&x_{23}&...&x_{2n}\\x_{31}&x_{32}&x_{......
  • 定义了鼠标指针放在一个元素边界范围内时所用的光标形状
    值描述url需使用的自定义光标的URL。注释:请在此列表的末端始终定义一种普通的光标,以防没有由URL定义的可用光标。default默认光标(通常是一个箭头)auto默认。浏览器设置的光标。crosshair光标呈现为十字线。pointer光标呈现为指示链接的指针(一只手)move此光标指示某对象可......
  • kubernetes 基本概念
    学习的目标是适用yml配置文件,使我们要构建的点描述出来。Kubernetes(简称K8s)是一个开源的容器编排平台,旨在自动化容器化应用程序的部署、扩展和管理。它提供了丰富的功能集,包括但不限于声明式配置、自我修复、负载均衡和服务发现等。以下是关于Kubernetes的一些关键知......
  • 详细讲解一下Rust中package、crate、module的概念
    在Rust中,package、crate和module是三个层次不同但又相互关联的概念,它们共同组成了Rust的代码组织和管理体系。以下是它们的详细介绍:1.Package(包)定义:一个package是一个由Cargo(Rust的构建工具和包管理器)管理的项目,包含一个或多个crate。核心文件:每个package至少......
  • 116. 填充每个节点的下一个右侧节点指针
    题目链接解题思路:其实就是在层序遍历的过程中,把next指针填上代码classSolution:defconnect(self,root:'Optional[Node]')->'Optional[Node]':ifroot==None:returnNone#层序遍历的过程中,填好nextqueue=deque()......
  • C++杂记02 指针
    好久没有更新推文了,最近换了工作,时间相对多了一点,有一点时间把过去的一些笔记内容给整理一下。能坚持学习和整理是一件很难的事情,当下大多数人的生活都相当碎片化,很多事做着做着就中断了,希望我能把我学习C++和OpenFOAM的一些内容写完。指针在OpenFOAM里面是一个很常见的内容,例如......
  • C++ 杂记03 指针(二) 智能指针
    C++中,智能指针与普通指针不同,是包含指针的一种类模板,用于管理动态分配的内存。智能指针的行为类似于常规指针,但是能够自动地释放所指向的对象,避免内存的泄露。智能指针通过对被引用对象进行计数的方式,或者其他机制,限制被引用的次数,避免形成循环引用。相较于常规指针,在使用完以后,......
  • c语言期末复习----指针
    一、指针基础知识1指针概念:指针是一个值为内存地址的变量2格式:指针在使用前一定要有明确指向(初始化)1)先声明再初始化 2)声明的同时初始化 inta,*p=&a;注:关于指针p的三个相关的值1)p,p里面存放着一个地址2)*p,p指向的对象的值3)&p,表示变量p本身的地址3*的作用1)定义指......
  • rust-analyzer 引入含有openssl包报错(openssl未找到)问题解决方案
    1.下载openssl编译后的包https://slproweb.com/products/Win32OpenSSL.html选择完全包2.安装注意下面这一步把dll安装到/bin所在的同级目录一路回车,最后的捐款可以不选3.设置环境变量经过实验,主要的环境变量有3个OPENSSL_DIR="C:\ProgramFiles\OpenSSL-Win64"这......
  • 丢手绢(尺取法/快慢指针)
    题目:链接:https://ac.nowcoder.com/acm/problem/207040题意:n个小朋友围成一个圈,给你这n个小朋友之间的距离,请你求出这些小朋友中隔得最远的两个之间的距离。(距离取逆时针距离与顺时针距离的最小值)思路:可以将这些小朋友围成的圈看作一个圆,把小朋友看作一个一个圆弧上距离不......