程序的内存可以在以下位置分配-
堆栈遵循后进先出的顺序。堆栈存储在编译时已知大小的数据值。如,固定大小为i32的变量是堆栈分配的候选对象 。它的大小在编译时已知。由于大小固定,所有标量类型都可以存储在堆栈中。
考虑一个字符串示例,该字符串在运行时分配了一个值。这样的字符串的确切大小不能在编译时确定。
堆内存存储在编译时大小未知的数据值。它用于存储动态数据。简而言之,将堆内存分配给在程序的整个生命周期中可能发生变化的数据值。堆是内存中与堆栈相比组织较少的区域。
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云原生微服务实践 -〔杨波〕