rust 智能指针

这篇具有很好参考价值的文章主要介绍了rust 智能指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Rust中基本数据类型(如整数、浮点数、布尔值等)通常存储在栈上。而动态分配的数据,如Box<T>Vec<T>等,存储在堆上。

Box 智能指针

Rust 中 Box 是一种智能指针类型,通常用于将值放置在堆上而不是栈上。在 Rust 中,由于所有值的默认生命周期都在当前作用域结束时结束,因此在情况需要延长对象的生命周期时,可以使用 Box 来将对象存储在堆上,以便在它们的所有权结束之前对它们进行访问。

struct User {
    name: String,
    age: i32,
}

fn main() {
    // 创建一个 User 对象,并将其存储在 Box 智能指针中
    let user = Box::new(User {
        name: "test".to_string(),
        age: 18,
    });

    // 通过解引用运算符来访问结构体对象的字段
    println!("name = {}", (*user).name);
    println!("age = {}", (*user).age);

    // 创建一个字符串对象,并将其存储在 Box 智能指针中
    let str = Box::new(String::from("Hello, World!"));

    // 通过解引用运算符来访问字符串对象中的字符
    println!("Character at index 7 = {}", (*str).chars().nth(7).unwrap());
}

Rc 智能指针

Rust 中的 Rc 类型是一个引用计数智能指针,它允许多个所有者共享相同的数据。每次创建一个 Rc 实例时,都会增加一个引用计数,并在所有者之间共享这个计数。当没有所有者时,引用计数将递减,一旦它达到零,数据将被释放。

use std::rc::Rc;

fn main() {
    let str = Rc::new("Hello, world!");

    // 获取引用计数为 1
    println!("strong_count: {}", Rc::strong_count(&str));

    // 创建一个新的所有者
    let str2 = Rc::clone(&str);

    // 获取引用计数为 2
    println!("strong_count: {}", Rc::strong_count(&str));
    println!("strong_count: {}", Rc::strong_count(&str2));
}

Arc 智能指针

Rust 中的 Arc 类型是一个原子引用计数,在多线程环境中,Rc 无法安全地使用,因为它的引用计数无法保证并发安全。Arc 提供了高效而安全的共享所有权机制,通过使用原子变量来保证线程安全。Arc 是一种非常有用的智能指针。它通过使用 clone 方法并通过原子方式增加引用计数来创建新的所有权证书,从而允许在多个线程中共享数据。

use std::sync::Arc;
use std::thread;

fn main() {
    let data = Arc::new(vec![1, 2, 3, 4, 5]);
    let handle = thread::spawn(move || {
        //克隆了一份到线程内部
        let local_data = data.clone();
        println!("local_data: {:?}", local_data);
    });

    handle.join().unwrap();
}

Cell 智能指针

Rust 中的 Cell 类型是一个原子可变容器,它允许我们持有一个不可变对象,并提供了对其中一个字段进行可变访问的能力。它常被用于资源共享或状态修改的小场景中。

use std::cell::Cell;

struct Point {
    x: i32,
    y: Cell<i32>,
}

fn main() {
    let point = Point { x: 5, y: Cell::new(10) };
    let old_y = point.y.get();
    point.y.set(20);
    let new_y = point.y.get();
    println!("Old y was {}, new y is {}", old_y, new_y);
}

RefCell 智能指针

Rust 中的 RefCell 类型是一个智能指针,它提供了内部可变性(mutability),允许我们在不可变引用之间修改值。但是,与 Cell 不同的是,RefCell 会在运行时进行借用检查来保证数据的安全性。

主要在以下两种情况下使用 RefCell:

  1. 当你需要在不可变引用之间修改值时;

  2. 当你不能使用 Rc,但仍需要共享所有权的时候。

use std::cell::RefCell;

fn main() {
    //RefCell提供内部可变性
    let cell = RefCell::new(10);
    {
        // 运行时会检查借用规则,所以这里必须加大括号
        // 将可写借用跟后面的只读借用隔离开来
        let mut mut_ref = cell.borrow_mut();
        *mut_ref += 1;
    }
    println!("{}", cell.borrow()); //11
}

RefCell相比Cell,内部维护了一个包装对象的引用计数,当通过 RefCell.borrow 获取一个共享引用时,内部引用计数加一,当获取的引用离开作用域时,内部引用计数减一,当RefCell.borrow_mut 获取一个可变引用时,首先检测引用计数是否为 0,如果为 0,正常返回,如果不为 0,直接 panic,其实 RefCell.borrow 时也会做类似的检测,当已经获取了可变引用也是直接 panic, 当然为了避免 panic,可以用 RefCell.try_borrow 和 RefCell.try_borrow_mut 来获取一个 Result 类型。文章来源地址https://www.toymoban.com/news/detail-463984.html

到了这里,关于rust 智能指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rust学习-智能指针

    示例1 无意义的例子:将一个单独的值存放在堆上并不是很有意义,b更应该放到栈上 示例2-递归类型 一种无法在编译时知道大小的类型是 递归类型(recursive type) 其值的一部分可以是相同类型的另一个值 递归类型来源于Lisp语言:cons 函数(“construct function\\\" 的缩写)利用两

    2024年02月16日
    浏览(27)
  • rust 智能指针

    Rust中基本数据类型(如整数、浮点数、布尔值等)通常存储在栈上。而动态分配的数据,如 BoxT 和 VecT 等,存储在堆上。 Rust 中 Box 是一种智能指针类型,通常用于将值放置在堆上而不是栈上。在 Rust 中,由于所有值的默认生命周期都在当前作用域结束时结束,因此在情况需

    2024年02月06日
    浏览(76)
  • Rust- 智能指针

    A smart pointer is a data structure that not only acts like a pointer but provides additional functionality. This “smartness” comes from the fact that smart pointers encapsulate additional logical or semantic rules, which are automatically applied to simplify memory or resource management tasks. While different programming languages implement smart point

    2024年02月14日
    浏览(36)
  • 【Rust】Rust学习 第十五章智能指针

    指针  ( pointer )是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的  引用 ( reference )。引用以   符号为标志并借用了他们所指向的值。除了引用数据没有任何其他特殊功能。它们也没有任

    2024年02月12日
    浏览(26)
  • 【Rust】Rust学习 第十四章智能指针

    指针  ( pointer )是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的  引用 ( reference )。引用以   符号为标志并借用了他们所指向的值。除了引用数据没有任何其他特殊功能。它们也没有任

    2024年02月12日
    浏览(24)
  • 【Rust 基础篇】Rust Rc 智能指针的使用

    在 Rust 中,Rc(Reference Counting)是一种智能指针,用于实现多所有权共享数据的引用计数。Rc 智能指针允许多个所有者共享相同的数据,并在没有任何所有者时自动释放数据。 本篇博客将详细介绍 Rust 中 Rc 智能指针的使用方法和相关概念,以及它在代码中的应用场景。 Rc 智

    2024年02月16日
    浏览(29)
  • 【跟小嘉学 Rust 编程】十五、智能指针

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月11日
    浏览(43)
  • Rust编程语言入门之智能指针

    指针:一个变量在内存中包含的是一个地址(指向其它数据) Rust 中最常见的指针就是”引用“ 引用: 使用 借用它指向的值 没有其余开销 最常见的指针类型 智能指针是这样一些数据结构: 行为和指针相似 有额外的元数据和功能 通过记录所有者的数量,使一份数据被多个

    2023年04月16日
    浏览(38)
  • 将浮点数转换为整数——浮点数和整数之间的转换方法详解

    将浮点数转换为整数——浮点数和整数之间的转换方法详解 在日常编程中,我们经常需要将浮点数转换为整数或者将整数转换为浮点数。这种转换可能因为不了解其背后的原理而出现错误,导致程序运行异常。本文将详细介绍浮点数和整数之间的转换方法,以帮助开发者在进

    2024年02月12日
    浏览(40)
  • Rust教程:How to Rust-基本类型

    本专栏是优质Rust技术专栏,推荐精通一门技术栈的蟹友,不建议完全无计算机基础的同学 感谢Rust圣经开源社区的同学,为后来者提供了非常优秀的Rust学习资源 本文使用: 操作系统macOS Sonoma 14 / Apple M1 编译器:Rustc Cargo 感谢一路相伴的朋友们,感谢你们的支持 ^ _ ^ Rust教

    2024年04月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包