范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

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

青春期快速增长阶段,这些表现家长要注意,抓住了孩子长得快镜子一个人的身体快速发育大致分成了三个阶段,其中,青春期是最后一个需要紧紧把握住的机会,一旦错过,孩子就再也没有长高个的可能性了。所以,作为家长我们有责任掌握关于孩子青春期长高的特营养风险儿童早期营养与成长趋势洞察报告发布充足营养在儿童早期发展中具有基石战略地位。营养不良近期可影响儿童脑发育体格生长肌肉发育以及机体组织的新陈代谢,远期还可能影响儿童的智力和认知水平免疫能力增加成年期慢性疾病的发生风险两年三次胎停,中西医结合助孕保胎,成功生娃美美今年35岁,宝宝已经6个月了,今年秋天抱他在怀里,去年秋天他还在肚子里。她给广东省生殖医院中医科主任李丽发了宝宝的照片,感谢李主任在艰辛曲折生育路上的专业帮助。2021年3月,快讯早知道12月19日天津楼市新闻汇总央行2023年的货币政策总量要够结构要准17日,在中国国际经济交流中心举办的20222023年中国经济年会上,央行副行长刘国强对2023年的货币政策进行了解读。他表示2023年的货今日炒股策略分析12月19日一市场风向标(5日涨幅排名)1格力地产,房地产,6连板。2多瑞医药,创业板化学制药,继续上涨。3西安饮食,酒店餐饮,5连板。4亨迪药业,创业板医药,继续上涨。5上海凯宝,创业板中药160年守正创新,长安凭什么引领自主车企转型?超181项专利技术95行业最高效率电驱总成1200km超长续航30C行业首发低温脉冲加热技术11月30日,长安汽车正式发布长安原力技术原力智能增程原力超集电驱。长安汽车表示,原力不谍照晚报一加将推流浪地球2联名,吉利熊猫mini配置曝光继荣耀将推出三体版荣耀80Pro的传闻后,又有一家手机厂商和大刘的作品扯上了联系,一加和流浪地球2的联名也已经得到证实。联名流浪地球2,一加11行星发动机特别版曝光今日流浪地球2电儿童发热咳嗽,到底要不要去医院?苏州儿科专家支招随着奥密克戎变异株致病性减弱和优化疫情防控措施出台,疫情防控面临新形势。目前,季节性呼吸道疾病高发,作为脆弱人群的主体,儿童的健康牵动着每个家庭的心。儿童呼吸道不适要不要去医院?发苏州旅行,同里古镇不能错过,也是杉杉来了拍摄地苏州是我最喜欢的城市之一,一来从最近的高铁站到苏州站只需20分钟。比我去上海其他地方都近的多,是个想去就随时能去的城市。二来上海的工作和生活节奏真的比较快,我去苏州就是去放松的。站今晚本年最后一调,国际原油价比去年低了,2因素油价还涨了9?国家发改委已经宣布,19日今晚24点开始,国内成品油价格做本年度最后一次调整。按照发改委的成品油价格调整机制来计算,国际原油变化率达到向下的6。63,最终国内汽油每吨下调480元,李嘉诚又来囤地了?逆势抄底,囤地获利。作者卢泳志编辑丨高岩来源野马财经在出售一套中国香港的豪宅之后,李嘉诚又来抄底,为屯地大计补仓。今年下半年以来,受美联储度密集加息英镑贬值等影响,李嘉诚家族旗下长
最新出炉!首届红谷滩区十大城市新地标网红打卡地夜幕下璀璨梦幻的摩天轮,五彩缤纷绚烂夺目的音乐喷泉,绿波荡漾鸟语花香的公园你喜欢红谷滩区的哪个场景?春节假期去哪游玩红谷滩区十大网红打卡地任你选给你提供一份最权威最有信服力的游玩指深圳市第1,佛山领先中山,清远市垫底!广东综合12强城市揭晓作为改革开放的先行之地,广东几十年以来一直都是各大省份的标杆!此外,作为一个人口大省,经济大省,广东也一直保持着蓬勃发展!在过去的一年里,广东的GDP已经达到了129118。58亿网站总被攻击?写个自动封禁IP的脚本给你个人网站总被攻击?写个自动封禁IP的脚本给你!具体如下1。在ngnix的conf目录下创建一个blockip。conf文件2。里面放需要封禁的IP,格式如下deny192。168。蒙古国实施签证便利化举措中国游客有望实现赴蒙古国边境口岸城市三日游来源人民网人民网乌兰巴托1月19日电(记者霍文)1月17日,蒙古国政府执行机构移民局局长乌干巴雅尔在接受人民网记者专访时表示,蒙古国实施了包括电子签发签证等一系列简化外国公民申请签春节假期去宁波享美育,走进城市大课堂请大家注意个人防护,不扎堆不聚集,做到防疫三件套,防护五还要。美育,亦称审美教育,是一种按照美的标准培养人的形象化的情感教育。它既通向人类历史文化的最大纵深,又关联着人类社会的未来全球一线城市房价比较文任泽平团队导读我们已连续4年跟踪全球一线城市房价,全球核心城市的房产是投资者大类资产配置中一个重要选项,2021年我们发布的长期抗通胀的三大硬通货提到,人口流入的都市圈的房子为硬春晚小品坑看了吗?中纪委网站发评论了!评春晚小品坑不能让躺平式干部再坑人了果然还得是沈腾马丽这节目立意我爱了2023年的兔年春晚,沈腾马丽艾伦等带来的小品坑辛辣讽刺,全程满是笑点,受到诸多观众的好评。沈腾在坑中非常形象喜气洋洋的赵今麦把地球的故事讲给宇宙赵今麦穿红色套装,喜气洋洋,显出好身材,青春有活力。一般来说,穿套装会显得成熟,不过赵今麦这个造型却很有年轻感,当然,她本来就年轻,双十年华。双手举在头上,明亮Shein成为了世界上最受欢迎的时尚品牌,而我们都付出了巨大代价2022年7月18日,中国南部的广东省,一名工人在为SHEIN供货的服装厂制作衣服。圣诞节前,以提升身体机能而闻名的巴黎生活博主Mlo在Instagram上传了一段视频,展示了来自鞠婧祎晒照甜美温柔,怦然心动,简直如同初恋般迷人图中,鞠婧祎的粉红色条纹衬衫,带着她的个性风格,还刻意展示了她迷人的直角肩。黑色背带裤的衬托下,她也显得更加性感。鞠婧祎脸上也有很精致的妆容,让阳光肆意地照在身上,白皙的皮肤也闪闪新年添金,来年加薪新的一年已到来,又到了展望未来的阶段,这样的日子里似乎更需要一些仪式感来激励自己。买一些心仪的饰品犒劳自己吧,不仅能在派对上装扮自己,还能够长久珍藏。虽然流行转瞬即逝,但金色单品能