Rust - Ownership

Rust - Ownership 首页 / Rust入门教程 / Rust - Ownership

程序的内存可以在以下位置分配-

  • Stack
  • Heap

Stack堆栈

堆栈遵循后进先出的顺序。堆栈存储在编译时已知大小的数据值。如,固定大小为i32的变量是堆栈分配的候选对象 。它的大小在编译时已知。由于大小固定,所有标量类型都可以存储在堆栈中。

考虑一个字符串示例,该字符串在运行时分配了一个值。这样的字符串的确切大小不能在编译时确定。

Heap堆

堆内存存储在编译时大小未知的数据值。它用于存储动态数据。简而言之,将堆内存分配给在程序的整个生命周期中可能发生变化的数据值。堆是内存中与堆栈相比组织较少的区域。

变量分配

Rust作为一种语言的主要卖点是其内存安全性,通过严格控制谁可以使用什么以及何时使用限制,可以实现内存安全。

考虑以下片段-

链接:https://www.learnfk.comhttps://www.learnfk.com/rust/rust-ownership.html

来源:LearnFk无涯教程网

fn main(){
   let v=vec![1,2,3]; 
   //向量 v 拥有堆中的对象

   //在任何给定时间只有一个变量拥有堆内存
   let v2=v; 
   //这里有两个变量拥有堆值,
   //rust 不允许两个指向相同内容的指针

   //Rust 在内存访问方面非常聪明,因此它会检测竞争条件,因为两个变量指向同一个堆

   println!("{:?}",v);
}

上面的示例声明了一个向量v。只有一个变量绑定到资源,或者 v 绑定到资源,或者 v2 绑定到资源。运行上面的示例抛出一个错误,这是因为资源的所有权已转移到v2。这意味着所有权从v移到v2(v2=v),并且在移动后v无效。

值传递

当我们将堆中的对象传递给闭包或函数时,值的所有权也会发生变化。

无涯教程网

fn main(){
   let v=vec![1,2,3];     //向量 v 拥有堆中的对象
   let v2=v;              //将所有权转移到 v2
   display(v2);             //v2移动到display方法
   println!("In main {:?}",v2);    //v2 在这里不再可用
}
fn display(v:Vec<i32>){
   println!("inside display {:?}",v);
}

函数返回值

传递给函数的所有权将在函数执行完成时失效,一种解决方法是让函数将拥有的对象返回给调用者。

fn main(){
   let v=vec![1,2,3];       //向量 v 拥有堆中的对象
   let v2=v;                //将所有权转移到 v2
   let v2_return=display(v2);    
   println!("In main {:?}",v2_return);
}
fn display(v:Vec<i32>)->Vec<i32> { 
   //返回相同的向量
   println!("inside display {:?}",v);
}

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

数据分析实战45讲 -〔陈旸〕

深入拆解Tomcat & Jetty -〔李号双〕

Linux实战技能100讲 -〔尹会生〕

微信小程序全栈开发实战 -〔李艺〕

Go 语言项目开发实战 -〔孔令飞〕

攻克视频技术 -〔李江〕

大厂设计进阶实战课 -〔小乔〕

超级访谈:对话玉伯 -〔玉伯〕

Python实战 · 从0到1搭建直播视频平台 -〔Barry〕

好记忆不如烂笔头。留下您的足迹吧 :)