首页 > 其他分享 >Rust 所有权和 Move 语义

Rust 所有权和 Move 语义

时间:2024-01-20 15:00:35浏览次数:28  
标签:生命周期 reference Move 语义 引用 规则 所有权 Rust

Rust 所有权和 Move 语义

所有权和生命周期是 Rust 和其它编程语言的主要区别,也是 Rust 其它知识点的基础。

动态数组因为大小在编译期无法确定,所以放在堆上,并且在栈上有一个包含了长度和容量的胖指针指向堆上的内存。

恰到好处的限制,反而会释放无穷的创意和生产力。

Rust 所有权规则

  • 一个值只能被一个变量所拥有,这个变量被称为所有者。
  • 一个值同一时刻只能有一个所有者,也就是说不能有两个变量拥有相同的值。所以对应变量赋值、参数传递、函数返回等行为,旧的所有者会把值的所有权转移给新的所有者,以便保证单一所有者的约束。
  • 当所有者离开作用域,其拥有的值被丢弃,内存得到释放。

这三条规则很好理解,核心就是保证单一所有权。其中第二条规则讲的所有权转移是 Move 语义,Rust 从 C++ 那里学习和借鉴了这个概念。

第三条规则中的作用域(scope)指一个代码块(block),在 Rust 中,一对花括号括起来的代码区就是一个作用域。举个例子,如果一个变量被定义在 if {} 内,那么 if 语句结束,这个变量的作用域就结束了,其值会被丢弃;同样的,函数里定义的变量,在离开函数时会被丢弃。

所有权规则,解决了谁真正拥有数据的生杀大权问题,让堆上数据的多重引用不复存在,这是它最大的优势。
但是,它也有一个缺点,就是每次赋值、参数传递、函数返回等行为,都会导致旧的所有者把值的所有权转移给新的所有者,这会导致一些性能上的问题。

Rust 提供了两种解决方案:

  • 如果你不希望值的所有权被转移,在 Move 语义外,Rust 提供了 Copy 语义。如果一个数据结构实现了 Copy trait,那么它就会使用 Copy 语义。这样,在你赋值或者传参时,值会自动按位拷贝(浅拷贝)。
  • 如果你不希望值的所有权被转移,又无法使用 Copy 语义,那你可以“借用”数据。

Rust 生命周期

生命周期(lifetime)是 Rust 中的一个概念,它描述了一个引用(reference)的生命周期。

在 Rust 中,生命周期可以用来解决引用(reference)的悬垂(dangling)问题。

Rust 中的引用

在 Rust 中,引用(reference)是一个特殊的指针,它指向一个特定的数据,并且可以被用来访问该数据。

Rust 中的引用(reference)分为两种:

  • 不可变引用(immutable reference):不可变引用是指指向不可变数据的引用,即不能修改被引用的数据。
  • 可变引用(mutable reference):可变引用是指指向可变数据的引用,即可以修改被引用的数据。
    Rust 中的引用(reference)是借用(borrow)的语法糖,它使得 Rust 中的数据更加安全。

Rust 中的生命周期

在 Rust 中,生命周期(lifetime)是引用(reference)的一个属性,它描述了一个引用(reference)的生命周期。

Rust 中的生命周期(lifetime)分为两种:

  • 静态生命周期('static):静态生命周期是指引用(reference)的生命周期直到程序结束。
  • 动态生命周期('a):动态生命周期是指引用(reference)的生命周期由其作用域(scope)决定。

Rust 中的借用检查器

在 Rust 中,借用检查器(borrow checker)是一个工具,它用于检查引用(reference)的合法性。

在 Rust 中,借用检查器会检查引用的生命周期,以确保引用的有效性。如果引用的生命周期不合法,那么编译器会给出错误提示。

Rust 中的所有权和借用规则

在 Rust 中,所有权和借用规则是 borrow checker 的基础。

Rust 的所有权规则规定,每个值都有一个所有者(owner),并且每个值只能有一个所有者。当所有者离开作用域时,该值将被丢弃。

Rust 的借用规则规定,当一个值被借出时,不能被再次借出。

Rust 中的生命周期规则

在 Rust 中,生命周期规则规定,当一个值被借出时,其生命周期必须大于等于所有者的生命周期。

如果一个值的生命周期小于所有者的生命周期,那么编译器会给出错误提示。

Rust 中的生命周期省略规则

在 Rust 中,生命周期省略规则规定,当一个值被借出时,其生命周期可以被省略。

如果编译器能够根据上下文推断出该值的生命周期,那么编译器会自动将其生命周期省略。

Rust 中的生命周期标注规则

在 Rust 中,生命周期标注规则规定,当一个值被借出时,其生命周期必须被标注。

如果编译器无法推断出该值的生命周期,那么编译器会给出错误提示。

标签:生命周期,reference,Move,语义,引用,规则,所有权,Rust
From: https://www.cnblogs.com/QiaoPengjun/p/17976484

相关文章

  • Rust 错误处理
    目录用panic!处理不可恢复的错误对应panic时的栈展开或终止使用panic!的backtraceWindows设置RUST_BACKTRACE环境变量的两种方式用Result处理可恢复的错误匹配不同的错误不同于使用match和Result<T,E>失败时panic的简写:unwrap和expect传播错误传播错误的简写:?......
  • Rust 常见集合
    目录使用Vector储存列表新建vectorVec::new函数(无初值)vec!宏(有初值)更新vector读取vector的元素注意可变和不可变引用遍历vector中的元素使用枚举来储存多种类型丢弃vector时也会丢弃其所有元素使用字符串储存UTF-8编码的文本什么是字符串?新建字符串更新字符串使......
  • Rust采集天气预报信息并实时更新数据
    最近天气温度时高时低,虽说这是大自然的力量人无法抗拒,不能改变那么我们就做预防工作。今天我将用Rust写一个爬虫程序实现电脑桌面实时更新天气情况,这个是一个底层逻辑,需要多方面配合,不仅要有完善的代码还有爬虫IP试试更新才能保证数据最完整最新。这是一个简单的示例,它使用Rust的网......
  • 42 干货系列从零用Rust编写负载均衡及代理,wmproxy中配置tcp转websocket
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/......
  • 22. 从零用Rust编写正反向代理,一个数据包的神奇HTTP历险记!
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmproxy数......
  • 23. 从零用Rust编写正反向代理,流控小姐姐的温柔一刀!
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmproxy温......
  • 大模型时代还需要知识图谱么?新一代知识图谱语义框架SPG赋能企业数智化转型
    企业在数字化过程中积累了海量的数据。企业需要不断地为用户创造价值,同时实现高效的经营管理和风险控制,这对企业的数字化基建提出了很高的要求,也为知识图谱(KnowledgeGraph,KG)、大语言模型(LargeLanguageModel,LLM)等AI技术提供了多样化的落地场景。本文以商家经营和风险防控为例,介......
  • 41. 干货系列从零用Rust编写负载均衡及代理,websocket与tcp的映射,WS与TCP互转
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/......
  • 初探: 通过pyo3用rust为python写扩展加速
    众所周知,python性能比较差,尤其在计算密集型的任务当中,所以机器学习领域的算法开发,大多是将python做胶水来用,他们会在项目中写大量的C/C++代码然后编译为so动态文件供python加载使用。那么时至今日,对于不想学习c/c++的朋友们,rust可以是一个不错的替代品,它有着现代化语言的设计和并......
  • [源码分析] - flex 标准文档导读与 一个rust实现解析
    本文是w3中css-flexbox[标准文档](CSSFlexibleBoxLayoutModuleLevel1(w3.org)解读.(2023.1),并对一些开源实现进行调研分析.文档导读csslayoutmodecsslayout模式用于确定在盒模型中的元素如何排布(大小与位置),在css2.1中有如下几种方式.blocklayout,块级别......