rust 智能指针

rust学习-Arc 线程安全的引用计数指针。“Arc”代表“原子引用计数 Atomically Reference Counted”。Arc 类型提供在堆中分配的 T 类型值的共享所有权(shared ownership)。在 Arc 上调用克隆会生成一个新的 Arc 实例,该实例指向堆上与源 Arc 相同的分配,同时增加引用计数。当指向给定分配的最后一个 Arc 指针被销毁时,存储在该分配中的值(通常称为“内部值”)也会被删除。 阅读详情

智能指针

Box

Box 的使用场景

由于 Box 是简单的封装,除了将值存储在堆上外,并没有其它性能上的损耗。而性能和功能往往是鱼和熊掌,因此 Box 相比其它智能指针,功能较为单一,可以在以下场景中使用它:

  • 特意的将数据分配在堆上
  • 数据较大时,又不想在转移所有权时进行数据拷贝
  • 类型的大小在编译期无法确定,但是我们又需要固定大小的类型时
  • 特征对象,用于说明对象实现了一个特征,而不是某个特定的类型
Box 堆对象分配

因为 Box 允许你将一个值分配到堆上,然后在栈上保留一个智能指针指向堆上的数据。

当栈上数据转移所有权时,实际上是把数据拷贝了一份,最终新旧变量各自拥有不同的数据,因此所有权并未转移。

fn main() {
    let a = Box::new(3);
    println!("a = {}", a); // a = 3

    // 下面一行代码将报错
    // let b = a + 1; // cannot add `{integer}` to `Box<{integer}>`
    //正确
    //let b = *a + 1
}
}
将动态大小类型变为 Sized 固定大小类型

Rust 需要在编译时知道类型占用多少空间,如果一种类型在编译时无法知道具体的大小,那么被称为动态大小类型 DST。

其中一种无法在编译时知道大小的类型是递归类型:在类型定义中又使用到了自身,或者说该类型的值的一部分可以是相同类型的其它值,这种值的嵌套理论上可以无限进行下去,所以 Rust 不知道递归类型需要多少空间:

enum List {
    Cons(i32, List),
    Nil,
}

以上就是函数式语言中常见的 Cons List,它的每个节点包含一个 i32 值,还包含了一个新的 List,因此这种嵌套可以无限进行下去,Rust 认为该类型是一个 DST 类型,并给予报错:

error[E0072]: recursive type `List` has infinite size //递归类型 `List` 拥有无限长的大小
 --> src/main.rs:3:1
  |
3 | enum List {
  | ^^^^^^^^^ recursive type has infinite size
4 |     Cons(i32, List),
  |               ---- recursive without indirection

此时若想解决这个问题,就可以使用我们的 Box:

enum List {
    Cons(i32, Box<List>),
    Nil,
}

只需要将 List 存储到堆上,然后使用一个智能指针指向它,即可完成从 DST 到 Sized 类型(固定大小类型)的华丽转变。

Box 中还提供了一个非常有用的关联函数:Box::leak,它可以消费掉 Box 并且强制目标值从内存中泄漏,读者可能会觉得,这有啥用啊?

fn main() {
   let s = gen_static_str();
   println!("{}", s);
}

fn gen_static_str() -> &'static str{
    let mut s = String::new();
    s.push_str("hello, world");

    Box::leak(s.into_boxed_str())
}
特征对象

在 Rust 中,想实现不同类型组成的数组只有两个办法:枚举和特征对象,前者限制较多,因此后者往往是最常用的解决办法。


trait Draw {
    fn draw(&self);
}

struct Button {
    id: u32,
}
impl Draw for Button {
    fn draw(&self) {
        println!("这是屏幕上第{}号按钮", self.id)
    }
}

struct Select {
    id: u32,
}

impl Draw for Select {
    fn draw(&self) {
        println!("这个选择框贼难用{}", self.id)
    }
}

fn main() {
    let elems: Vec<Box<dyn Draw>> = vec![Box::new(Button { id: 1 }), Box::new(Select { id: 2 })];

    for e in elems {
        e.draw()
    }
}

Box::leak

Box 中还提供了一个非常有用的关联函数:Box::leak,它可以消费掉 Box 并且强制目标值从内存中泄漏,读者可能会觉得,这有啥用啊?

其实还真有点用,例如,你可以把一个 String 类型,变成一个 'static 生命周期的 &str 类型:

fn main() {
   let s = gen_static_str();
   println!("{}", s);
}

fn gen_static_str() -> &'static str{
    let mut s = String::new();
    s.push_str("hello, world");

    Box::leak(s.into_boxed_str())
}

Deref 解引用

智能指针的名称来源,主要就在于它实现了 Deref 和 Drop 特征,这两个特征可以智能地帮助我们节省使用上的负担:

Deref 可以让智能指针像引用那样工作,这样你就可以写出同时支持智能指针和引用的代码,例如 *T
Drop 允许你指定智能指针超出作用域后自动执行的代码

常规引用的解引用。

常规引用是一个指针类型,包含了目标数据存储的内存地址。对常规引用使用 * 操作符,就可以通过解引用的方式获取到内存地址对应的数据值:

fn main() {
    let x = 5;
    let y = &x;

    assert_eq!(5, x);
    assert_eq!(5, *y);
}

这里 y 就是一个常规引用,包含了值 5 所在的内存地址,然后通过解引用 *y,我们获取到了值 5。如果你试图执行 assert_eq!(5, y);,代码就会无情报错,因为你无法将一个引用与一个数值做比较:

error[E0277]: can't compare `{integer}` with `&{integer}` //无法将{integer} 与&{integer}进行比较
 --> src/main.rs:6:5
  |
6 |     assert_eq!(5, y);
  |     ^^^^^^^^^^^^^^^^^ no implementation for `{integer} == &{integer}`
  |
  = help: the trait `PartialEq<&{integer}>` is not implemented for `{integer}`
                    // 你需要为{integer}实现用于比较的特征PartialEq<&{integer}>
智能指针解引用

实现 Deref 后的智能指针结构体,就可以像普通引用一样,通过 * 进行解引用,例如 Box 智能指针:

fn main() {
    let x = Box::new(1);
    let sum = *x + 1;
}

智能指针 x 被 * 解引用为 i32 类型的值 1,然后再进行求和。

定义自己的智能指针

由于 Box 本身很简单,并没有包含类如长度、最大长度等信息,因此用一个元组结构体即可。

struct MyBox<T>(T);

impl<T> MyBox<T> {
    fn new(x: T) -> MyBox<T> {
        MyBox(x)
    }
}

跟 Box 一样,我们的智能指针也持有一个 T 类型的值,然后使用关联函数 MyBox::new 来创建智能指针。由于还未实现 Deref 特征,此时使用 * 肯定会报错:

fn main() {
    let y = MyBox::new(5);

    assert_eq!(5, *y);
}

运行后,报错如下:

error[E0614]: type `MyBox<{integer}>` cannot be dereferenced
  --> src/main.rs:12:19
   |
12 |     assert_eq!(5, *y);
   |                   ^^
为智能指针实现 Deref 特征

现在来为 MyBox 实现 Deref 特征,以支持 * 解引用操作符:

use std::ops::Deref;

impl<T> Deref for MyBox<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

很简单,当解引用 MyBox 智能指针时,返回元组结构体中的元素 &self.0,有几点要注意的:

在 Deref 特征中声明了关联类型 Target,在之前章节中介绍过,关联类型主要是为了提升代码可读性
deref 返回的是一个常规引用,可以被 * 进行解引用

* 背后的原理

当我们对智能指针 Box 进行解引用时,实际上 Rust 为我们调用了以下方法:

*(y.deref())

首先调用 deref 方法返回值的常规引用,然后通过 * 对常规引用进行解引用,最终获取到目标值。

要注意的是,* 不会无限递归替换,从 *y 到 *(y.deref()) 只会发生一次。

函数和方法中的隐式 Deref 转换

对于函数和方法的传参,Rust 提供了一个极其有用的隐式转换:Deref 转换。若一个类型实现了 Deref 特征,那它的引用在传给函数或方法时,会根据参数签名来决定是否进行隐式的 Deref 转换,例如:

fn main() {
    let s = String::from("hello world");
    display(&s)
}

fn display(s: &str) {
    println!("{}",s);
}

以上代码有几点值得注意:

String 实现了 Deref 特征,可以在需要时自动被转换为 &str 类型

  • &s 是一个 &String 类型,当它被传给 display 函数时,自动通过 Deref 转换成了 &str
  • 必须使用 &s 的方式来触发 Deref(仅引用类型的实参才会触发自动解引用)
连续的隐式 Deref 转换

Deref 可以支持连续的隐式转换,直到找到适合的形式为止:

fn main() {
    let s = MyBox::new(String::from("hello world"));
    display(&s)
}

fn display(s: &str) {
    println!("{}",s);
}

这里我们使用了之前自定义的智能指针 MyBox,并将其通过连续的隐式转换变成 &str 类型:首先 MyBox 被 Deref 成 String 类型,结果并不能满足 display 函数参数的要求,编译器发现 String 还可以继续 Deref 成 &str,最终成功的匹配了函数参数。

引用归一化

Rust 编译器实际上只能对 &v 形式的引用进行解引用操作,那么问题来了,如果是一个智能指针或者 &&&&v 类型的呢? 该如何对这两个进行解引用?

答案是:Rust 会在解引用时自动把智能指针和 &&&&v 做引用归一化操作,转换成 &v 形式,最终再对 &v 进行解引用:

把智能指针(比如在库中定义的,Box、Rc、Arc、Cow 等)从结构体脱壳为内部的引用类型,也就是转成结构体内部的 &v
把多重&,例如 &&&&&&&v,归一成 &v

三种 Deref 转换

实际上 Rust 还支持将一个可变的引用转换成另一个可变的引用以及将一个可变引用转换成不可变的引用,规则如下:

  • 当 T: Deref<Target=U>,可以将 &T 转换成 &U,也就是我们之前看到的例子
  • 当 T: DerefMut<Target=U>,可以将 &mut T 转换成 &mut U
  • 当 T: Deref<Target=U>,可以将 &mut T 转换成 &U
    来看一个关于 DerefMut 的例子:
struct MyBox<T> {
    v: T,
}

impl<T> MyBox<T> {
    fn new(x: T) -> MyBox<T> {
        MyBox { v: x }
    }
}

use std::ops::Deref;

impl<T> Deref for MyBox<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.v
    }
}

use std::ops::DerefMut;

impl<T> DerefMut for MyBox<T> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.v
    }
}

fn main() {
    let mut s = MyBox::new(String::from("hello, "));
    display(&mut s)
}

fn display(s: &mut String) {
    s.push_str("world");
    println!("{}", s);
}

以上代码有几点值得注意:

Rc 与 Arc

引用计数(reference counting),顾名思义,通过记录一个数据被引用的次数来确定该数据是否正在被使用。当引用次数归零时,就代表该数据不再被使用,因此可以被清理释放。

use std::rc::Rc;
fn main() {    
let a = Rc::new(String::from("hello, world"));    
let b = Rc::clone(&a);    
assert_eq!(2, Rc::strong_count(&a));    
assert_eq!(Rc::strong_count(&a), Rc::strong_count(&b))}

以上代码我们使用 Rc::new 创建了一个新的 Rc 智能指针并赋给变量 a,该指针指向底层的字符串数据。智能指针 Rc 在创建时,还会将引用计数加 1,此时获取引用计数的关联函数 Rc::strong_count 返回的值将是 1。Rc::clone接着,我们又使用 Rc::clone 克隆了一份智能指针 Rc,并将该智能指针的引用计数增加到 2。由于 a 和 b 是同一个智能指针的两个副本,因此通过它们两个获取引用计数的结果都是 2。不要被 clone 字样所迷惑,以为所有的 clone 都是深拷贝。这里的 clone 仅仅复制了智能指针并增加了引用计数,并没有克隆底层数据,因此 a 和 b 是共享了底层的字符串 s,这种复制效率是非常高的。

Rc 简单总结
  • Rc/Arc 是不可变引用,你无法修改它指向的值,只能进行读取,如果要修改,需要配合内部可变性 RefCell 或互斥锁 Mutex
  • 一旦最后一个拥有者消失,则资源会自动被回收,这个生命周期是在编译期就确定下来的
  • Rc 只能用于同一线程内部,想要用于线程之间的对象共享,你需要使用 Arc
  • Rc 是一个智能指针,实现了 Deref 特征,因此你无需先解开 Rc 指针,再使用里面的 T,而是可以直接使用 T
Arc

Arc 是 Atomic Rc 的缩写,顾名思义:原子化的 Rc 智能指针。它能保证我们的数据能够安全的在线程间共享即可.
Arc 和 Rc 拥有完全一样的 API,修改起来很简单:

use std::sync::Arc;use std::thread;
fn main() {    
let s = Arc::new(String::from("多线程漫游者"));    
for _ in 0..10 {        
let s = Arc::clone(&s);        
let handle = thread::spawn(move || {           println!("{}", s)       
 });    
 }}

Cell 和 RefCell

因此 Rust 提供了 Cell 和 RefCell 用于内部可变性,简而言之,可以在拥有不可变引用的同时修改目标数据。

Cell

Cell 和 RefCell 在功能上没有区别,区别在于 Cell 适用于 T 实现 Copy 的情况.

use std::cell::Cell;
fn main() {
  let c = Cell::new("asdf");
  let one = c.get();
  c.set("qwer");
  let two = c.get();
  println!("{},{}", one, two);
}
RefCell

由于 Cell 类型针对的是实现了 Copy 特征的值类型,因此在实际开发中,Cell 使用的并不多,因为我们要解决的往往是可变、不可变引用共存导致的问题,此时就需要借助于 RefCell 来达成目的。

所有权、借用规则与这些智能指针做一个对比:

Rust 规则智能指针带来的额外规则
一个数据只有一个所有者Rc/Arc让一个数据可以拥有多个所有者
要么多个不可变借用,要么一个可变借用RefCell实现编译期可变、不可变引用共存
违背规则导致编译错误违背规则导致运行时panic
use std::cell::RefCell;

fn main() {
    let s = RefCell::new(String::from("hello, world"));
    let s1 = s.borrow();
    let s2 = s.borrow_mut();

    println!("{},{}", s1, s2);
}
Rc + RefCell 组合使用

Rust 中,一个常见的组合就是 Rc 和 RefCell 在一起使用,前者可以实现一个数据拥有多个所有者,后者可以实现数据的可变性:


use std::cell::RefCell;
use std::rc::Rc;
fn main() {
    let s = Rc::new(RefCell::new("我很善变,还拥有多个主人".to_string()));

    let s1 = s.clone();
    let s2 = s.clone();
    // let mut s2 = s.borrow_mut();
    s2.borrow_mut().push_str(", oh yeah!");

    println!("{:?}\n{:?}\n{:?}", s, s1, s2);
}
Rust中的引用计数Arc与Rc Rc 单线程引用计数。不是线程安全的,如果需要线程间引用计数可用Arc。注意他们之间的实现区别。 //! Single-threaded reference-counting pointers. 'Rc' stands for 'Reference //! Counted'. // This is repr(C) to future-proof against possible field-reordering, which // would interfere with otherwise safe [ 阅读详情

相关推荐

Rust 智能指针

在Rust中,智能指针是封装了原始指针(如*const T或*mut T)的封装类型,它们在运行时持有关联数据的生命周期。智能指针的主要作用是提供对内存的安全管理,同时避免了传统的指针操作中常见的错误,如悬垂指针、野指针和数据竞争等。Rust的智能指针为开发者提供了一种强大的工具,它们不仅简化了内存管理,还提高了代码的健壮性和可读性。通过合理使用智能指针,可以有效地利用Rust的所有权系统,避免内存泄漏和其他内存相关错误。

lly202406的博客 837

Rust中Box、Rc、Arc、Cell、RefCell、Cow简介

一、Box 是一种独享所有权智能指针,类似C++的unique_ptr 资源分配在堆上,依靠Deref和Drop来管理堆上的资源,零运行时开销,是最常用的套娃。 Box::new(v) : 创建,移动语义,独占所有权 - move,允许使用*转移本体所有权 不可变借用:Box::borrow()、Box::as_ref()、Box::deref() 可变借用:Box::borrow_mut()、Box::as_mut()、Box::deref_mut() 二、Rc是一种共享所有权智能指针,类似C++的s

rayylee 8713

rust教程 第一章 —— 初识rust

本文主要的目的就是认识一下rust这门语言的基本概念

余识- 5万+

【Rust 基础篇】Rust Box 智能指针

Box是一个指向堆上分配的值的指针。它提供了所有权转移和释放内存的功能。使用Box智能指针,可以在编译时保证内存安全,避免悬挂指针和内存泄漏等问题。Box在栈上存储指针,指向堆上的数据。在转移所有权时负责释放堆上的内存。大小固定,适用于已知大小的类型。只能有一个所有者,不可共享引用。本篇博客详细介绍了 Rust 中的Box智能指针的使用方法和特性。Box提供了堆分配和所有权转移的功能,可以在编译时保证内存安全,并解决递归类型的问题。希望本篇博客对你理解和应用 Rust 中的Box。

繁依Fanyi的博客 1936

【Rust智能指针】Rust智能指针原理剖析与应用指导

Rust语言以其内存安全和零成本抽象的特性而闻名,其中智能指针是实现这些特性的重要组成部分。 与C++中的智能指针类似,Rust的智能指针提供了比普通引用更丰富的功能,但在实现和使用上有着Rust特有的设计哲学。 智能指针是Rust中一种特殊的数据结构,它们不仅包含指针功能,还附加了额外的元数据和功能。Rust标准库提供了多种智能指针类型,每种都有其特定的用途。

景天科技苑 5万+

MuJoCo柔性体仿真实战:从FlexComp建模到自定义模型导入

柔性体仿真是机器人交互研究中不可或缺的一环,MuJoCo作为高精度物理求解器,凭借高效的求解速度与批量并行能力,成为强化学习与软体抓取任务的热门选择。其FlexComp机制将连续材料离散为粒子-约束系统,以较低建模成本模拟布料、软组织等形变行为,相比Gazebo等平台更具实时性与可扩展性。技术价值体现在自定义柔性体建模与导入流程中:通过XML配置网格密度、间距与材料参数,即可生成贴合任务需求的软体垫子或硅胶抓手。在柔性抓取、颗粒抓手、医疗仿真等场景中,该方法能快速构建可训练的环境。围绕环境搭建、FlexCo

weixin_29045585的博客 160

rust智能指针

特性引用 (&T 和 &mut T)智能指针(如 Box、Rc)所有权引用没有所有权,只是借用数据智能指针拥有数据的所有权内存管理不负责内存管理负责内存管理,通常有自动销毁机制生命周期有明确的生命周期生命周期取决于智能指针本身数据存储位置引用通常指向栈或堆上的数据智能指针通常分配堆上的内存操作只提供对数据的访问提供更多的操作功能,如引用计数、自动清理等线程安全不保证线程安全一些智能指针(如 Arc)是线程安全的MyBox(x)

喜欢打篮球的普通人 1798

Python量化入门:用pytdx获取800个交易日K线数据的完整指南(附代码)

本文为Python量化交易初学者提供了使用pytdx库免费获取股票日线级别K线数据的完整指南。文章详细介绍了从环境搭建、单只股票数据获取,到构建健壮的批量下载器、数据清洗与验证,再到基础分析与可视化的全流程,并附有可直接运行的代码示例,帮助读者快速建立本地股票数据库。

weixin_29050513的博客 1465

【Rust中的智能指针】

传统的指针,如C++中的裸指针,需要开发者自己申请和释放,如果开发者在使用过程中疏漏了回收,将会造成内存泄漏,在部署实施时也会有oom的风险,智能指针即是为了解决这类问题而出现的,老生常谈的shared_ptr,unique_ptr,weak_ptr等,都是通过设计使得代码自动管理回收堆上的内存,提高代码的健壮性和方便性。Rust由于其严格的安全性和所有权机制,除unsafe写法外,所有的堆内存都是通过语言特性管理的。

m0_37719524的博客 1233

Verilog中generate for循环的5个实战技巧(附完整代码示例)

本文详细介绍了Verilog中generate for循环的5个高级实战技巧,包括参数化模块实例化、条件化生成、多维硬件结构实现等,并附有完整代码示例。这些技巧能显著提升FPGA开发效率,特别适合中级Verilog开发者学习应用。

weixin_28725949的博客 187

切比雪夫(最小区域法)直线拟合算法

切比雪夫,最小区域法直线拟合

闪电彬彬的博客 3962

Rust 智能指针深入浅出

《Rust智能指针全面解析》摘要: Rust智能指针是管理内存的高级工具,兼具指针功能和额外管理能力。主要类型包括:Box<T>用于单一所有权堆分配;Rc<T>实现单线程引用计数共享;RefCell<T>提供内部可变性;Arc<T>支持线程安全共享;Mutex<T>确保线程间安全修改。智能指针通过Deref和Drop trait实现解引用和资源清理,可组合使用(如Rc<RefCell<T>>或Arc<Mutex<

萧曳丶 956

免安装版Notepad++终极配置:右键菜单+图标美化+多文件批量处理(2024新版)

本文详细介绍了如何为免安装版Notepad++进行终极配置,包括右键菜单添加、图标美化以及多文件批量处理功能。通过注册表编辑和高级定制,用户可以在便携版中实现与安装版相同的功能体验,同时保持系统整洁。特别适合开发者、系统管理员和效率追求者使用。

nut55的博客 830

Rust——智能指针

Rust智能指针

JAN6055的博客 2321

语言模型推理能力与计算表达力深度解析

语言模型的推理能力本质上是一种知识迁移与泛化应用的过程,其核心在于Transformer架构中的自注意力机制和前馈网络的协同作用。计算表达力作为衡量模型能力的关键指标,涉及函数逼近、组合泛化和上下文理解等多个维度。随着模型规模的扩大,涌现能力现象揭示了参数规模与推理能力之间的非线性关系。在实际应用中,通过提示工程和微调策略可以有效激活和优化模型的推理表现。当前研究正探索模块化架构和世界模型整合等方向,以突破长程推理和因果关系建模等前沿挑战。本文深入探讨了语言模型推理泛化的技术原理与实践方法,为理解计算表达力

weixin_42521032的博客 343

前沿探索:基于强化学习的目标检测与跟踪技术及论文解析

前沿探索:基于强化学习的目标检测与跟踪技术及论文解析 ,人工智能,计算机视觉,大模型,AI,本文聚焦基于强化学习的目标检测与跟踪技术,先介绍相关技术基础,包括目标检测、跟踪及强化学习的算法等。接着阐述强化学习在目标检测与跟踪中的应用思路、框架及典型算法,解析三篇相关论文的背景、方法、实验结果。还探讨了该技术面临的样本效率、奖励函数设计等挑战,以及结合迁移学习等的未来发展方向,为该领域研究提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 11万+

Rust 智能指针,让人省心

Rust 智能指针是所有权系统的 延伸,记住了!

码刀攻城 1411

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Rust 智能指针详解

Rust智能指针摘要(150字) Rust智能指针是内存管理核心工具,包括: Box<T>:堆分配,所有权唯一,用于递归类型/大数据转移 Rc<T>/Weak<T>:单线程引用计数,Weak解决循环引用 RefCell<T>:运行时借用检查实现内部可变性 Arc<T>:线程安全引用计数,多线程共享数据基础 Mutex<T>/RwLock<T>:线程同步,保护共享可变数据 组合模式常见: 单线程:Rc<RefCell&l

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1527

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Rust学习(七):智能指针

作为一种编程语言,Rust中最常见的指针类型就是引用,而引用只是一种普通指针,除引用数据之外,没有其他功能。为了更方便的处理复杂的结构数据,有必要在开始我们的算法之旅前,介绍Rust中智能指针的概率,当然,这里我们只会简单的介绍一些常用的智能指针,如果大家对此感到困惑,或者是想进一步深入的学习智能指针的设计哲学,建议阅读其Rust学习资料(doge)。智能指针是一种数据结构,其行为类似于指针,含有元数据,在大部分情况下拥有数据的所有权,提供内存管理或绑定等附加功能,如管理文件句柄和网络链接。

2301_77286822的博客 1190

Rust学习之智能指针

在 Rust 中,最常见的指针类型是引用,引用本身指向某个值,不会造成性能上的额外损耗。而智能指针比引用有更复杂的数据结构,包含比引用更多的信息,例如元数据,当前长度,最大可用长度等。引用和智能指针的另一个不同在于前者仅仅是借用了数据,而后者往往可以拥有它们指向的数据。智能指针往往是基于结构体实现,它与我们自定义的结构体最大的区别在于它实现了Deref和DropDeref*TDrop动态字符串String和动态数组可以将值分配到堆上)、Rc(引用计数类型,允许多所有权存在)、Ref和。

2301_79967122的博客 947

Rust权威指南之智能指针

本文来源于阅读《Rust权威指南》第十五章:智能指针的读书笔记。快速了解Rust中Box、Rc、RefCell和Weak的相关知识。

学习和工作总结,共勉! 1821

Rust 的智能指针

Rust 的智能指针

一起coding,一起嗨。 604
上一篇: rustlings本地开发环境配置
下一篇: panads操作excel
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5342粉丝 225原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值