所有者

收藏977

阅读11225

更新时间2025-08-27

程序的内存可以按以下方式分配 −

  • 堆栈

堆栈

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

考虑一个字符串示例,它在运行时被分配一个值。 此类字符串的确切大小无法在编译时确定。 因此它不是堆栈分配的候选者,而是堆分配的候选者。

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

什么是所有者?

Rust 中的每个值都有一个变量,称为值的所有者。 Rust 中存储的每个数据都会有一个与其关联的所有者。 例如,在语法中 − let age = 30, age 是值 30 的所有者。

  • 每个数据一次只能有一个所有者。

  • 两个变量不能指向同一内存位置。 变量将始终指向不同的内存位置。

转让所有者

价的所有者可以通过以下方式转移: −

  • 将一个变量的值分配给另一个变量。

  • 将值传递给函数。

  • 从函数返回值。

将一个变量的值赋给另一个变量

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

考虑以下代码片段 −

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

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

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

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

上面的示例声明了一个向量 v。所有者的想法是只有一个变量绑定到资源,v 绑定到资源或 v2 绑定到资源 。 上面的例子抛出一个错误 − use of moved value: `v`。这是因为资源的所有者已转移到 v2。 这意味着所有者从 v 转移到 v2 (v2=v),转移后 v 失效。

将值传递给函数

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

fn main(){
   let v = vec![1,2,3];     // 向量 v 拥有堆中的对象
   let v2 = v;              // 将所有者移至 v2
   display(v2);             // v2 移至显示且 v2 失效
   println!("In main {:?}",v2);    // v2 在这里不再可用
}
fn display(v:Vec){
   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)->Vec { 
   // 返回相同的向量
   println!("inside display {:?}",v);
}

所有者和原始类型

对于基本类型,一个变量的内容被复制到另一个变量。 因此,没有发生所有者转移。 这是因为原始变量比对象需要更少的资源。 考虑下面的例子 −

fn main(){
   let u1 = 10;
   let u2 = u1;  // u1 值复制(未移动)到 u2

   println!("u1 = {}",u1);
}

输出将为 – 10。


相关

视频

RELATED VIDEOS

更多

免费

phpStudy极速入门视频教程

免费

Midjourney基础课程
初级 Midjourney基础课程

11149次学习

收藏

免费

极客学院Git使用视频教程

免费

尚观shell视频教程
高级 尚观shell视频教程

15709次学习

收藏

免费

尚观Linux入门视频教程
初级 尚观Linux入门视频教程

42887次学习

收藏

免费

尚观Linux初级视频教程
初级 尚观Linux初级视频教程

40264次学习

收藏

免费

尚观Linux中级视频教程
中级 尚观Linux中级视频教程

48298次学习

收藏

免费

尚观Linux高级视频教程
高级 尚观Linux高级视频教程

41982次学习

收藏

科技资讯

更多

精选课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

61.7万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

39.3万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

70.9万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

61.6万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

23万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

33.9万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

125万人学习

关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号