rust学习笔记5-所有权机制

server/2025/2/27 12:00:12/

rust核心就是所有权机制,是其内存管理的核心特性,旨在消除内存安全问题(如空指针、悬垂指针、内存泄漏等)而无需依赖垃圾回收(GC)

1.首先看一下语义模型

当声明一个变量 let a = "32";它的语义模型如下:

        当声明一个变量时候,它就绑定了一个数据、scope以及一片内存区域,它就拥有一个所有权,并且它的所有权是可以出借(引用)的,变量不管是拥有还是引用,它都可以设置为可变和不可变,默认为不可变,拥有所有权的变量离开当前scope进入新scope时候,会调用Move(Copy)。同时它的生命周期(LifeTime)和内存管理机制Rall也在所有权机制下进行,只有拥有这个变量的所有权,才能对它进行内存释放、销毁等操作。

2.所有权的类型系统
rust语言它的编译器遵循一种仿射类型(Affine Type)下的一个子结构类型系统(SubstructuralType Systems),资源最多被使用一次,具体实现就Move(Copy)。

3.内存管理

默认存储数据到栈上,如整形、浮点、布尔、枚举等
利用栈来自动管理堆内存,如数组、元组、字符串等

4.借用(Borrowing)
通过引用(&)借用值,避免所有权转移:
    不可变引用(&T)
    允许同时存在多个不可变引用,但不能修改值。

rust">let s = String::from("hello");
let len = calculate_length(&s); // 借用 s
println!("s is still valid: {}", s); // 合法fn calculate_length(s: &String) -> usize {s.len()
}

    可变引用(&mut T)
    同一作用域内,同一数据只能有一个可变引用,且不能与其他引用共存:

rust">let mut s = String::from("hello");
let s_ref = &mut s;
s_ref.push_str(", world");
// let s_ref2 = &mut s; // 编译错误:同一作用域只能有一个可变引用

5.所有权共亨

rust所有权共享有两种一种是clone,另一种是copy,区别在于,clone是要求编写代码自己去调用,copy是在编译的时候,编译自己完成,不需要自己去调用

rust">fn main() {//基本类型(如 i32、bool)实现了 Copy trait,赋值时直接复制值而非转移所有权:let x = 5;let y = x; // 复制值,x 仍有效println!("x = {}, y = {}", x, y);//Rust会尽可能地降低程序的运行成本,所以默认情况下,长度较大的数据存放在堆中,//且采用移动的方式进行数据交互。但如果需要将数据单纯的复制一份以供他用,可以使用clonelet s1 = String::from("hello");let s2 = s1.clone();println!("s1 = {}, s2 = {}", s1, s2);}

总结

Rust 的所有权机制通过编译时静态检查强制开发者遵循内存安全规则。虽然初期需要适应所有权转移、借用和生命周期等概念,但它能从根本上解决内存安全问题,是 Rust 系统级编程能力的基石。


http://www.ppmy.cn/server/171028.html

相关文章

学习记录:初次学习使用transformers进行大模型微调

初次使用transformers进行大模型微调 环境: 电脑配置: 笔记本电脑:I5(6核12线程) 16G RTX3070(8G显存) 需要自行解决科学上网 Python环境: python版本:3.8.8 大模型&#xff1a…

鸿蒙NEXT开发-视频播放绘图能力

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 目录 1. 视频播放 1.1 视频播放基本介绍 1.2…

html - 手工添加上次阅读的位置, 方便下次阅读

文章目录 html - 手工添加上次阅读的位置, 方便下次阅读概述笔记END html - 手工添加上次阅读的位置, 方便下次阅读 概述 在看一本电子书,有pdf格式的,但是比较喜欢看html格式的(复制比较方便)。 但是有个缺点,如果看到一半,关掉…

Megatron-LM:使用模型并行训练数十亿参数的语言模型

摘要 最近在语言建模方面的工作表明,训练大型Transformer模型能够推动自然语言处理应用的技术前沿。然而,由于内存限制,训练非常大的模型可能相当困难。在这项工作中,我们展示了训练极大Transformer模型的技术,并实现…

DeepSeek 与网络安全:AI 在网络安全领域的应用与挑战

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 在当今数字化时代,网络安全已成为国家、企业和个人面临的重要挑战。从传统的病毒、木马攻击,到高…

批量将手机照片修改为一寸白底证件照的方法

生活中经常需要用到一寸白底证件照,但每次去照相馆拍摄既费时又麻烦。其实,利用手机拍照和批量证件照生成工具,就能轻松批量修改手机照片为一寸白底证件照。 首先,在电脑浏览器中打开【报名电子照助手】,找到“批量证件…

神经网络参数量计算

算一个只有两层的神经网络的参数量,我们需要考虑两层之间的连接权重和偏置项。以下是详细的计算步骤: 网络结构 输入层(第一层): 有 2 个神经元。 输出层(第二层): 有 3 个神经元。…

使用消息队列怎样防止消息重复?

大家好,我是君哥。 使用消息队列时,我们经常会遇到一个可能对业务产生影响的问题,消息重复。在订单、扣款、对账等对幂等有要求的场景,消息重复的问题必须解决。 那怎样应对重复消息呢?今天来聊一聊这个话题。 1.三…