纠纷奇闻社交美文家庭
投稿投诉
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

1。6所有权解决了什么问题?及其使用方法

4月8日 话藏心投稿
  上一节我们快速浏览了函数及控制结构,加上1。4节的数据类型,是不是跃跃欲试,想大干一场了呢?哈哈,脚印还得一个一个踩,我们今天还得说一说rust的一个重要概念所有权。
  我们先不讲所有权概念,先来看一个例子,有什么问题,再看看主流语言都是怎么解决这些问题的,有什么痛点,再来看rust的解决方法,就水到渠成,能更好地理解了。
  考虑一个查找函数:(力扣高手勿喷)给一个数组和一个目标值,用循环遍历数组找出等于目标值的元素索引。fnmain(){letdatavec!〔10,42,9,8〕;letv42;ifletSome(pos)findpos(data,v){println!(Found{}at{},v,pos);}}fnfindpos(data:Vecu32,v:u32)Optionusize{for(pos,item)indata。iter()。enumerate(){ifitemv{returnSome(pos);}}None}
  在C中,findpos是传了一个数组的引用,所以堆上数组还是只有一份,只是引用计数1了(浅拷贝),而多个调用就会出现多个引用,这些引用是通过专门维护引用的代码来管理的,运行时会带来一定的性能损耗。
  在java中,GC是通过追踪式定时查看哪些内存标记不使用了,就会清理掉,同样也会带来运行时性能损耗。
  我们可以看出,主流语言都会有一些问题。那rust有什么好方法吗?
  有,rust借鉴了C的move语义,配合使用所有权,高效、优美地解决了以上问题,下面我们来看rust是怎么做到的:fnmain(){letdatavec!〔10,42,9,8〕;data是数组的所有者letv42;ifletSome(pos)findpos(data,v){data在函数调用时,把所有权移动给函数data,data自动失去数组所有权,编译器会阻止后续代码访问dataprintln!(Found{}at{},v,pos);}}fnfindpos(data:Vecu32,v:u32)Optionusize{函数作用域开始,data拥有数组所有权for(pos,item)indata。iter()。enumerate(){ifitemv{returnSome(pos);}}None}函数作用域结束,data被丢弃,堆内存被释放
  我加了注释,你们应该很容易能看明白,rust通过move移动语义把数组所有权交给了函数参数,在函数里data拥有数组的所有权,而函数结束时数组也被安全释放。
  这里没有使用多个引用,也不用在运行时再去管理引用计数或者定时清理标记未使用内存块,而是在编译期就安全的管理了堆内存。这就是rust优秀的内存管理之一,优雅、高效。只要能编译通过,rust程序一般而言都不会有什么问题,所以我们很多时候都是在和编译器作斗真
  来看看rust所有权三大原则:一个值只能被一个变量拥有,这个变量是这个值的所有者。一个值在同一时刻只能有一个所有者,所以在函数传参、变量赋值、函数返回等行为,都是旧所有者把所有权移动给新所有者,以符合这一规则。当所有者离开其作用域,他拥有的值被丢弃,内存安全释放。
  所有权虽然很好的解决了多重引用、引用计数管理以及运行时定时检查内存的问题,但是也规定了一个时刻只能有一个变量拥有值,那像上个例子,若我们程序功能要求在函数传参后,需要继续使用原data,还想要使用它指向的数组呢?
  这就要用到clone()函数,她可以把数组在内存拷贝一份,然后传回新数组地址给函数调用(深拷贝):fnmain(){letdatavec!〔10,42,9,8〕;letv42;ifletSome(pos)findpos(data。clone()),v){传值给函数的是clone()的新数组,原data可继续使用,编译器不会报错println!(Found{}at{},v,pos);}}fnfindpos(data:Vecu32,v:u32)Optionusize{clone的数组所有权在datafor(pos,item)indata。iter()。enumerate(){ifitemv{returnSome(pos);}}None}data离开作用域,clone的数组失效,堆内存被正确释放
  当然,如果有需求需要多次clone(),这样深拷贝多个堆数据也不高效,还会用到下一节要说到的copy和borrow等语法。
  好了,我们学习了rust很重要的所有权概念,知道了他解决了什么问题,为什么要这么设计,还对比了rust和主流语言的内存管理机制,相信你已经更好理解了所有权,我觉得写rust程序越写越能养成好习惯,因为编译器会不停地督促我写出更健壮的代码对于今天的内容你有什么看法呢?欢迎在评论区留言讨论!如果觉得文章有用,记得点赞关注加收藏,以后就会第一时间收到文章推送啦:D
  本文由ByteBunny原创,欢迎关注,带你一起长知识!
投诉 评论 转载

阿媒输球后阿根廷进行了一次自发的会议,球员想扭转现在的形势直播吧11月24日讯世界杯小组赛首轮,阿根廷爆冷12输给沙特。TYC记者GastnEdul发文,表示在输球后球队进行了一次自发的谈话。球员们想要扭转目前的形势,并用行动证……10个保养习惯,让你越活越年轻1每天坚持揉腹部每天坚持做,促进肠蠕动,消除便秘,还有利于减肥,通过不同力度,促进脂肪的消耗,收到满意的减肥效果。2抗紫外线一定要注意防晒,无论天气怎么样,出门一定……我们的银河系我们生活在一个我们简称为银河系的星系中。银河系是一个中等大小的旋涡星系,或者更准确地说是一个棒旋星系,有旋臂,中间有一种笔直的结构。事实上我们没有银河系的照片,因为我们都……飞机上的秘密空姐睡觉的地方在哪里?上机后为何要拉帘子?文长白山日记编辑长白山日记飞机上的秘密,大家了解吗?飞机中途停机休息时,乘务人员为何要把乘客赶下飞机,是有些工作是不能让乘客看见吗?十几个小时的长途飞行……iQOONeo7对比一加AcePro,谁更值得买,一眼看懂iQOONeo7一加AcePro性能天玑9000LPDDR5UFS3。1骁龙8Gen1LPDDR5UFS3。1屏幕6。78英寸1……风扇界的华为,一台风扇风扇驱蚊充电宝照明灯天气渐暖,小伙伴们又开始蠢蠢欲动了。选个周末,约上三五好友去露营,在大自然里呼吸着青草香的空气,享受这一刻的惬意时光。但说真的,外面太热,想到口罩分分钟沾满汗水,整……与苏州结缘40年,华南虎有了专属卡通形象标识昨天上午,一列满载游客的科普小火车,从上方山北部出发,驶向苏州市动物园中国华南虎苏州培育基地,为华南虎举办卡通形象发布会。这个由苏州小学生创作的卡通华南虎,头顶祥云、手藏爱心,……蒸海带真能降血压吗?之前有个网友给我留言,他听人说吃蒸海带有助于降血压,想问一下是不是真的。其实这样是有一定作用的。海带它的钾含量很丰富,可以降低人体对钠的吸收,这样是有利于控制血压的。除此……讲真的,小个子别总穿高跟鞋,学这位时尚博主的穿法,显高还气质随着气温的不断攀升,我们也正式迎来了夏季。而对于小个子来说,夏季穿搭无疑是一个新的挑战,既要规避身高上的短板,又得在此基础上打造出清凉显高的造型。但若是你今年还在选择高跟……上海吃面用最廉价的面,配最昂贵的浇头在上海吃面就像在广东喝茶随处可见同样的广东喝茶重点不在茶在茶点上海吃面主要不是吃面是吃浇头同一家面店20元一碗的辣肉大排雪……苏迪曼杯亮相金马市民抢鲜与苏迪曼同框昨天(3月12日)上午,在金马跑者奋力奔跑的同时,与苏州有关的另一项重大赛事在赛道边上和市民来了个亲密接触苏迪曼杯在这里惊艳亮相,让大家先睹为快。2023年道达尔能源苏迪……1。6所有权解决了什么问题?及其使用方法上一节我们快速浏览了函数及控制结构,加上1。4节的数据类型,是不是跃跃欲试,想大干一场了呢?哈哈,脚印还得一个一个踩,我们今天还得说一说rust的一个重要概念所有权。我们……
预告窗造不凡,轩尼斯门窗以航天品质逐梦星辰万里专坑女性的妇科骗局,是时候结束了重回洛杉矶太兴奋!贝弗利举办派对庆祝,女友身穿超短裙大秀身材体操女神庞盼盼,退役后为工作奔波,曾一度落魄到上求职节目游戏分享与你相隔只差七年从黄帝内经看春季养生恋情曝光惨遭全网嘲,欧阳娜娜的塌房,给流量艺人敲响了警钟纯白色连衣裙洁净素雅,简约高级又显干净,轻松穿出名媛气质秋冬季皮肤瘙痒和湿疹的防治iPhone13Pro使用体验,堪称完美神机,综合体验31省区市上半年房地产投资态势感知湖北增速最快男性晨起的3个行为,或比喝酒伤肝,若你也有,请早改掉

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形