Rust之所有权

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

1、所有权的概念:

程序需要管理自己在运行时使用的计算机内部空间。Rust语言采用包含特定规则的所有权系统来管理内存,这套规则允许编译器在编译的过程中执行检查工作,而不会产生任何的运行时开销。

(1)、所有权规则:

  • Rust中的每一个值都有一个对应的变量作为它的所有者;
  • 在同一时间内,值有且仅有一个所有者;
  • 当所有者离开自己的作用域时,它持有的值就会被释放掉。

(2)、变量的作用域:

作用域是指一个对象在程序中的有效范围。
变量的有效范围说明:

{//S未被声明,在这里还不可用
	let s = "hello";//从这里开始S变得可用
	//执行与S相关的操作
}//作用域到这儿结束,变量S再次不可用

2、String类型:

String类型的数据存放在堆上,是一个可变的字符串类型。Rust在变量结束的地方会自动调用drop函数,String类型的作者在drop函数中编写了自动释放内存的程序。
注意:任何简单的标量的组合类型都是可以Copy的,任何需要分配内存或某种资源的类型都不会是Copy的。下面是一些拥有Copy这种trait的类型:

  • 所有的整数类型;
  • 仅拥有两种值的布尔类型;
  • 字符类型;
  • 所有的浮点类型;
  • 如果元组所包含的所有字段的类型都是Copy的,那么这个元组也是Copy的。

3、所有权与函数:

将值传递给函数在语义上类似于对变量进行赋值。将变量传递给函数将会触发移动或复制,就像赋值语句一样。

fn main()
{
	let s = String::from("hello");//变量s进入作用域
	takes_owership(s);//s的值被移动进了函数
	//s的值在这里不再有效
	let x = 5;//x进入作用域
	make_copy(x);//x的值被传递进了函数
	//由于i32是Copy的,所以在这儿依旧可以使用x
}//x的值首先离开作用域,随后是s
//由于s已经发生了移动,所以不会发生什么情况
fn takes_owership(some_string:String){//s进入作用域
	println!("{}",some_string);
}//some_string在这里离开作用域,drop函数被自动调用
//some_string所占用的内存被释放
fn make_copy(some_integer:i32){//some_integer进入作用域
	println!("{}",some_integer);
}//some_integer在这里离开作用域,没有什么发生

4、返回值与作用域:

函数在返回值的过程中也会发生所有权的转移。
变量所有权的转移总会遵循相同的模式:将一个变量赋值给另一个变量时就会转移所有权。当一个持有堆数据的变量离开作用域时,它的数据就会被drop清理回收,除非这些数据的所有权转移到了另一个变量上。

5、引用与借用:

引用是指在不获取所有权的前提下使用某个变量的值。
示例:

fn main(){
	let s1 = String::from("hello");
	let len = calculate_length(&s1);
	println!("The length of '{}'is {}.",s1,len);
}
fn calculate_length -> usize{
	s.len()
}

在调用calculate_length函数时使用了&s1作为参数,并且在该函数的定义中,使用&String替代了String。
其中&代表的就是引用的语义。
由于引用并不持有值的所有权,所以当引用离开当前作用域的时候,它指向的值也不会被丢弃,同样也不能对引用值进行更改。
这种通过引用传递参数给函数的方法也被称为借用。

6、可变引用:

将变量声明为mut s,再使用&mut s给函数传递一个可变引用,并将函数签名改为some_string:&mut String来使其接收一个可变引用作为参数。
可变引用在使用上有一个限制:对于特定作用域中的特定数值来说,一次只能声明一个可变引用。以下示例违背了这条规则:

let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s;

Rust中的这一限定性规则可以帮助在编译时避免数据竞争。数据竞争与竞态条件十分相似,它会在满足以下三种情况时发生:

  1. 两个或两个以上的指针同时访问同一空间;
  2. 其中至少有一个指针会向空间中写入数据;
  3. 没有同步数据访问的机制。
    数据竞争会导致未定义行为,这些未定义行为会使得出现的bug难以被修复和诊断。

7、悬垂引用:

悬垂指针指向曾经存在的某处内存地址,但该内存已近被释放甚至是被重新分配另作他用了。

8、切片:

切片允许我们引用集合中某一段连续的元素序列,而不是整个集合。

(1)、字符串切片:

字符串切片是指向String对象中某个连续部分的引用,它使用方式如下:

let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];

使用方括号中指定切片的范围区间[starting_index..ending_index],其中starting_index是切片起始位置的索引值,ending_index是切片终止位置的下一个索引值。切片数据结构在内部存储了指向起始位置的引用和一个描述切片长度的字段,这个描述切片长度的字段等价于ending_index减去starting_index
注:当范围是从第一个元素开始时,可以省略两个点号之前的值;当切片包含String中的最后一个字节时,可以省略双点号之后的值。

(2)、其它类型的切片:

字符串切片是专门用来处理字符串的,除此之外,Rust还存在其他更为通用的切片类型,以数组为例:

let a = [1,2,3,4,5];
let slice = &a[1..3];

这与字符串切片的工作机制完全一样。文章来源地址https://www.toymoban.com/news/detail-601887.html

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

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

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

相关文章

  • Rust所有权机制

    所有权机制是Rust的核心功能之一,对于初学者算是一个重难点,它保证了程序无需GC,即可自动化的释放内存 希望这篇博客可以帮助你快速理解所有权机制 Rust的值都只有一个变量是该值的所有者 所有者可以切换,但是值在任一时刻有且仅有一个所有者 当所有者离开作用域

    2024年02月07日
    浏览(30)
  • 【Rust】所有权

    所有权是Rust最独特的特性,它让Rust无需GC(Garbage Collection)就可保证内存安全。Rust的核心特性就是所有权,所有程序在运行时都必须管理它们使用计算机内存的方式。有些语言有垃圾回收机制,在程序运行时会不断地寻找不再使用的内存。在其他语言中,程序员必须显式地

    2024年02月11日
    浏览(33)
  • Rust所有权

    什么是所有权 所有程序在运行时都必须管理其使用计算机内存的方式: 一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的内存,比如C#和Java。 在另一些语言中,程序员必须自行分配和释放内存,比如C/C++。 而Rust则是通过所有权系统管理内存: 所有权是

    2024年02月07日
    浏览(30)
  • Rust-所有权(ownership)

    Rust入门学习系列-Rust 的核心功能(之一)是 所有权(ownership)。引入这个概念是为了更好的管理计算机的内存。下面篇幅让我们来研究下这个功能有什么神奇之处。 常见的编程语言中计算机内存管理方式: Java:Java使用Java虚拟机(JVM)来管理计算机内存。JVM有一个垃圾回收

    2024年02月19日
    浏览(28)
  • Rust核心功能之一(所有权)

    目录 1、什么是所有权? 1.1 所有权规则  1.2 变量作用域 1.3 String 类型 1.4 内存与分配 变量与数据交互的方式(一):移动 变量与数据交互的方式(二):克隆 只在栈上的数据:拷贝 1.5 所有权与函数 1.6 返回值与作用域 所有权(系统)是 Rust 最为与众不同的特性,对语言的

    2024年02月04日
    浏览(31)
  • Rust-所有权和移动语义

    拿C语言的代码来打个比方。我们可能会在堆上创建一个对象,然后使用一个指针来管理这个对象: 接下来,我们可能需要使用这个对象: 然而,这段代码之后,谁能猜得到,指针p指向的对象究竟发生了什么?它是否被修改过了?它还存在吗,是否已经被释放?是否有另外一个指

    2024年01月18日
    浏览(30)
  • Rust语法:所有权&引用&生命周期

    垃圾回收管理内存 Python,Java这类语言在管理内存时引用了一种叫做垃圾回收的技术,这种技术会为每个变量设置一个引用计数器(reference counter),来统计每个对象的引用次数。 一旦某个对象的引用数为0,垃圾回收器就会择取一个时机将其所占用的空间回收。 以Python为例子

    2024年02月12日
    浏览(40)
  • 30天拿下Rust之所有权

    概述         在编程语言的世界中,Rust凭借其独特的所有权机制脱颖而出,为开发者提供了一种新颖而强大的工具来防止内存错误。这一特性不仅确保了代码的安全性,还极大地提升了程序的性能。在Rust中,所有权是一种编译时检查机制,用于追踪哪些内存或资源何时可

    2024年03月08日
    浏览(29)
  • 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 本章节将讲解 Rust 独有的概念(所有权)。所有权是 Rust 最独特的特性,它使得 Rust 能够

    2024年02月10日
    浏览(34)
  • Rust 基础入门 —— 2.3.所有权和借用

    Rust 的最主要光芒: 内存安全 。 实现方式: 所有权系统 。 因为我们这里实际讲述的内容是关于 内存安全的,所以我们最好先复习一下内存的知识。 然后我们,需要理解的就只有所有权概念,以及为了开发便利,进一步引出的引用借用概念。 内存作为存储程序运行时数据

    2024年02月12日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包