Rust - Ownership

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

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

  • Stack
  • Heap

Stack堆栈

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

无涯教程网

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

Heap堆

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

变量分配

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

考虑以下片段-

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);
}

函数返回值

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

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

来源:LearnFk无涯教程网

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);
}

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

技术教程推荐

深入浅出区块链 -〔陈浩〕

Spring Boot与Kubernetes云原生微服务实践 -〔杨波〕

手机摄影 -〔@随你们去〕

打造爆款短视频 -〔周维〕

容量保障核心技术与实战 -〔吴骏龙〕

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

郭东白的架构课 -〔郭东白〕

反爬虫兵法演绎20讲 -〔DS Hunter〕

深入浅出可观测性 -〔翁一磊〕

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