文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Rust你不认识的所有权

2023-01-29 12:01

关注

在Rust中是没有内存垃圾回收机制(GC)的,那Rust是如何保障内存安全的呢?这就引出了“所有权”这个概念。

我们看下下面这段伪代码

let s = "helloString";
t = s;
print(s);

在之前我们学习的语言中,比如C语言,对于上述伪代码的执行结果应该是正常打印"helloString" 的内容,但是在Rust中,执行上述代码时,会出现如下提示

------ 增加所有权返回内容;

而产生这个结果的原因就是触发了Rust语言中所有权机制:

在看这三条机制之前,需要先说明一下Rust中变量作用域的概念

作用域:一个对象在程序中有效的范围。

比如如下Rust代码

{
    let s = "hello";
}

在花括号内部就是变量s的作用域,当源码超出这个范围后,变量s将不再可用,即

{
    let s = "hello";
}
println!("{}", s);

打印这一句代码编译时会报错。因为在Rust语言中,当变量离开作用域时Rust会自动调用变量的"drop"函数,以此保障内存的快速回收。上述源码中,在代码执行到“}”时,Rust调用了变量s的drop函数,所以s指向的内存失效,从而导致在执行打印语句时会出错,也就是这个逻辑保障了Rust语言中内存的安全性。

我们再说回文章开头的伪代码例子,为什么编译时会出现问题,这里我们就要详细介绍一下这些语句在Rust中的逻辑。

let s = "helloString";

这句语句是声明了一个变量并使用“helloString”进行了初始化

简化展示,隐藏内部详细逻辑

t = s;

这个语句是将变量s的内容同时赋值给变量t,如下图,如果每次赋值的时候都全量内存拷贝一份的话,那整体语言性能会下降很多(毕竟变量地址大小还是不可确定的),所以处理方式是新建一个变量t,然后将内容内存指向s的指向地址。

上述情况下就出现了一个情况,同一个值被两个变量所指向,这个不符合Rust所有权的规则,所以Rust根据所有权做了一个语言限制,即当s赋值给新的变量t时,变量t指向s指向的内容,而变量s本身将被Rust擦除,所以在执行完赋值语句后,等号右侧(也就是s)将无效,在Rust语言中将这个行为叫做变量的移动,从字面意思理解也就是将变量s所有的值移动到变量t中,移动完成后s的生命周期也随之结束。

Rust有了移动这个概念,那对于其他语言中的深度拷贝或再次赋值的情况下Rust中该如何做呢?为了解决这个问题,Rust提出了另外一个变量与数据的交互方式——克隆,意思就是将s的数据完整的克隆一份给t,s的内容不变:

以Rust字符串数据结构为例子,可参考如下:

let s1 = String::from("hello");
let s2 = s1.clone();  // 此处为克隆的默认方法
println!("s1={}, s2={}", s1, s2); 

从执行结果可以看出,克隆后s1变量内容不变,还可以继续使用。

上述就是Rust所有权的一些学习心得。

到此这篇关于Rust你不认识的所有权的文章就介绍到这了,更多相关Rust所有权内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯