首页 > 编程语言 >rust 程序设计笔记(2)所有权 & 引用

rust 程序设计笔记(2)所有权 & 引用

时间:2023-11-12 22:11:25浏览次数:31  
标签:String 作用域 s1 笔记 引用 字符串 程序设计 盘子 rust

  • 所有权
    • 数据存储在栈和堆上,存放在栈上的数据都是已知所占据空间的
    • 突然的问题
// 内存中的栈是怎么存储数据的?
好的,想象一下你有一摞盘子。你只能从上面放盘子,也只能从上面拿盘子,这就是栈的工作方式。

在内存中,栈是用来存储数据的地方,它工作得就像这摞盘子。当你的程序运行一个函数时,这个函数的局部变量就会像放盘子一样,一个接一个地放到栈上。这些局部变量包括基本数据类型,比如整数或者布尔值,它们的大小是已知的,而且很容易快速地被放进去和拿出来。

当这个函数结束的时候,它的局部变量就会像拿盘子一样,从栈上一个接一个地被拿掉。这个过程非常快,因为它们是按顺序来的,就像你放盘子时从上面放,拿盘子时也是从上面拿。

所以栈就像是厨房里整齐的盘子摞,每次你只能用最上面的盘子,用完之后再把它放回去,这样就保持了整洁和有序。而在内存的栈中,数据也是这样整齐有序地存放和使用的。这就是为什么栈这么快,因为它不需要去搜索一个特定的盘子,它总是拿最上面的那个。

// 所以当我的程序执行到一个作用域的时候,就会往栈上去存放当前作用域有效的变量,在当前作用域没有使用,并且局部变量没有再被使用的时候,就会释放,这样理解对吗?
完全正确!就像你在玩积木,每进入一个新的游戏环节(也就是编程中的作用域),你就会在桌上(栈)搭建一些积木(变量)。只要在这个游戏环节中,你可以使用这些积木做很多事情。

当这个游戏环节结束了,也就是你完成了当前的积木搭建,这些积木就会被清理掉,桌面(栈)就又空出来了,可以用来进行下一个游戏环节的搭建。这样的好处是,你不用担心清理积木,因为游戏(程序)会自动帮你做这件事。

每次进入一个新的作用域,栈就会存放新的数据,当作用域结束,使用过的数据就会被移除。这个过程保证了内存的高效使用,因为你总是只在顶部搭积木,也只从顶部清理积木,这样操作起来非常快速。这也就是为什么栈被用来存储作用域内的局部变量,因为这些局部变量通常在作用域结束时就不再需要了。
  • 但是指针是存放在栈上的呀!

    fn main() {
        let s1 = String::from("hello");
        let _s2 = s1;
    
        println!("{}, world!", s1);
    }
    /**
    --> src/main.rs:5:28
      |
    2 |     let s1 = String::from("hello");
      |         -- move occurs because `s1` has type `String`, **which does not implement the `Copy` trait**
    3 |     let _s2 = s1;
      |               -- value moved here
    4 |
    5 |     println!("{}, world!", s1);
      |                            ^^ value borrowed here after move
      |
      = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
    help: consider cloning the value if the performance cost is acceptable
      |
    3 |     let _s2 = s1.clone();
      |                 ++++++++
    
    For more information about this error, try `rustc --explain E0382`.
    error: could not compile `ownership` (bin "ownership") due to previous error
    */
    
    • rust的浅拷贝会同时使原本的变量无效,这会避免重复的内存释放,因为rust在作用域结束时会自动调用drop方法。在上面那段代码中,当s1倍赋值给s2以后,就无效了,不能再被使用。Rust 永远也不会自动创建数据的 “深拷贝”。因此,任何 自动 的复制可以被认为对运行时性能影响较小。

相关文章

  • 《Unix/Linux系统编程》教材学习笔记第十四章
    chapter14MySQLMySQL(MySQL2018)是一个关系数据库系统(Codd1970)。在关系数据库中,数据存储在表中。每个表由多个行和列组成。表中的数据相互关联。表也可能与其他表有关联。关系结构使得可在表上运行查询来检索信息并修改数据库中的数据。关系数据库系统的标准查询语言是SQL(结......
  • 【pdb笔记】
    参考链接:10分钟教程掌握Python调试器pdb在pdb中进入交互式解释器#在(Pdb)状态下输入interact,键入回车(Pdb)interact退出interact#按下ctrl+z,键入回车;看参考的知乎链接里说是ctrl+d,可能是python版本问题>>>^Z设置命令行参数#直接在要调试的py文件后输入参数就行了p......
  • rustbook-ch1-入门指南-总结
    rustbook-ch1-入门指南-总结1、安装rust之前需要安装一个C语言编译器。正常编译、执行rust程序,需要一个链接器。由于C语言编译器通常都会附带链接器,所以需要安装一个C语言编译器。除了编译执行需要链接器外,一部分常用的Rust包会依赖使用C语言编写的代码,为了编译这些Rust代码,也需......
  • 2023-2024-1 20231407陈原《计算机科学与概论》与《C语言程序设计》第七周学习总结
    这个作业属于哪里?2023-2024计算机基础与程序设计作业要求是什么?https://www.cnblogs.com/rocedu/p/9577842.html#WEEK07作业目的是什么计算机科学概论第8章《C语言程序设计》第6章作业正文  https://www.cnblogs.com/CCCY12345/p/17827874.html学习了程序中......
  • 《Unix/Linux系统编程》教材学习笔记第十三章
    chapter13网络编程内容网络编程内容包括:TCP/IP协议、UDP和TCP协议、服务器-客户机计算、HTTP和Web页面、动态Web页面的PHP和CGI编程。TCP/IP协议TCP/IP(Comer1988,2001;RFC11801991)是互联网的基础。TCP代表传输控制协议。IP代表互联网协议。目前有两个版本的IP,即IPv4和IPv6。......
  • 2023-2024-1 20231325 《计算机基础与程序设计》第7周学习总结
    ###目录*作业信息*教材学习内容总结1.《计算机科学概论》第8章2.《c语言程序设计》第6章*基于AI的学习*学习心得*学习进度条作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业的要求在哪里1.学习《计算机科学概论》第8章并完成......
  • 2023-2024-1 20231321 《计算机基础与程序设计》第7周学习总结
    2023-2024-120231321《计算机基础与程序设计》第7周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP这个作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13003这个作业的目标《计......
  • 2023-2024-1 学号:20231305 《计算机基础与程序设计》第7周学习总结
    2023-2024-1学号:20231305《计算机基础与程序设计》第7周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标<自学教材计算......
  • 《Unix/Linux系统编程》教材学习笔记第十二章
    chapter12块设备I/O缓冲区读写普通文件的算法依赖于两个关键操作,即get_block和put_block,这两个操作将磁盘块读写到内存缓冲区中。由于与内存访问相比,磁盘I/O速度较慢,所以不希望在每次执行读写文件操作时都执行磁盘I/O。因此,大多数文件系统使用I/O缓冲来减少进出存储设备的物理I/......
  • 学年(2023-2024-1)学号(20231311)《计算机基础与程序设计》第7周学习总结
    2023-2024-120231311《计算机基础与程序设计》第7周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第七周作业这个作业的目标1.学习计算机科学概论第8章并完成云班课测试2.《C语言程......