Rust in Action笔记 第六章 内存

这篇具有很好参考价值的文章主要介绍了Rust in Action笔记 第六章 内存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. Option<T>类型在Rust中使用了空指针优化(null pointer optimization)来保证该类型在编译后的二进制文件中占用0个字节。None变量是通过一个空指针null pointer来表示;
  2. 内存地址、指针、引用的区别,内存地址是指在内存中的一个字节,由汇编语言提供的一个抽象;指针,有时候也称为裸指针(raw pointer),是指向某种数据类型的内存地址,指针是由高级语言提供的抽象;引用,是一种指针,在动态类型中,引用包含了一个指针以及一些额外的保证,引用是由Rust提供的抽象;
  3. Rust的引用提供了比指针更多的好处:引用永远指向有效的数据;引用的字节排列是紧凑的,有助于CPU快速读取;引用能够提供变长数据类型的长度保证,引用的结构中除了内部指针本身外,还提供一个数据长度的变量,确保程序永远不会跑到内存范围之外;
  4. {:p}可以把变量安装指针的形式打印,打印其内存地址;
  5. 代码列表6.3展示了两种从u8数组转化成字符串的形式,b变量通过String::from_raw_parts(ptr, size, capa)首先把[u8; 10]转化成*const u8然后转化成*mut u8;c变量引入了CStr外部接口,通过CStr::from_ptr(c_ptr)获取一个以\0结尾的C语言类型的字符串;b和c变量都需要把[u8, n]先转换成*const u8在转换成所需的相应指针类型;
  6. Rust的裸指针分为*const T*mut T,分别是不可变裸指针和可变裸指针,两者之间可以自由转换,Rust的引用&mut T and &T编译出来的结果就成了裸指针,也就是在实际运行过程中不需要通过unsafe也能得到裸指针的性能;
  7. 使用裸指针的原因:不可避免的使用,当需要系统调用OS功能或者某些第三方代码需要裸指针,一般是对C写的一些程序的外部调用;需要多个地方同时访问数据并且对运行时性能要求极高的时候;
  8. C++中的智能指针在Rust中对应的是core::ptr::{Unique, Shared, Weak},胖指针(fat pointer)通常指内存布局,对比瘦指针(thin pointer,通常也指裸指针,只有一个usize宽度),要更大一些,通常有2个usize宽度甚至更多;
  9. core::ptr::Unique是rust中String, Box<T>的构成要素;core::ptr::SharedRc<T>, Arc<T>的构成要素,如果要实现自己的智能指针,可以参考这些智能指针的实现细节;
  10. std::rc::Weak, std::arc::Weak可用于内部互相指向的数据结构,避免循环指针的问题;alloc::raw_vec::RawVec用于实现了Vec<T>, VecDeq<T>,它能够很聪明地给任何类型的数据分配和回收内存;std::cell::UnsafeCell用于实现Cell<T>, RefCell<T>,来提供内部可变性(interior mutability);
  11. "When in doubt, prefer the stack"表示了当不知道把数据放在堆上还是栈上时,优先放在栈上,因为栈比较快,这句话的Rust版本是,When in doulbe, use types that implement Sized,即实现了Sized特征的类型会优先放在栈上存储;
  12. 如何让一个函数同时接受&str, String两种类型的参数,可以使用参数模板<T: AsRef<str>>表示参数T可以称为str的引用,从而调用.as_ref().len()方法,详细可见Page189;
  13. 表6.1给出了简单的栈和堆的对比,注意表中说明了在没有Unsafe的Rust中,使用堆是安全的;
    Rust in Action笔记 第六章 内存
  14. 几个通用的优化堆内存分配的方法:提前分配好足够的空间,将其初始化为0,到使用的时候再将其改为非0值,这种方法比较危险,可能会引发Rust的生命周期检查;自己针对程序设计一个allocator,能更有效地分配出所需的空间;调研使用arena::{Arena, TypedArena},允许对象边创建边使用(created on the fly),arena是一个第三方库,链接;
  15. 虚拟内存常用术语,页(Page)、字(Word)、页错误(Page fault)、交换(Swapping)、虚拟内存(Virtual memory)、实际内存(Real memory)、页表(Page table)、段(Segment)、段错误(Segmentation fault)、MMU、TLB(translation lookaside buffer),详见Page203;
  16. 6.4.2节讲了段错误(segmentation fault),当访问一个非法区域时会产生,可以参考下代码实现;
  17. 6.4.3节讲了MMU(memory mamagement unit)的作用,即把虚拟地址翻译成物理地址,以及使用TLB缓存加速的作用, 206页讲了操作系统和CPU在翻译地址过程中用到的一些小tricks;
  18. 下图讲了一个可执行文件(ELF)是如何加载到虚拟内存并运行的过程Rust in Action笔记 第六章 内存

文章来源地址https://www.toymoban.com/news/detail-481483.html

到了这里,关于Rust in Action笔记 第六章 内存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第六章 集合引用类型

    6.1 Object         到目前为止,大多数引用值的示例使用的是Object类型。Object是ECMAScript中最常用的类型之一。虽然Object的实例没有多少功能,但很适合存储和在应用程序间交换数据。         显式地创建Object的实例有两种方式。第一种是使用new操作符和Object构造函数,

    2024年01月18日
    浏览(45)
  • 第六章 集合引用类型(中)——定型数组

    6.3 定型数组         定型数组(typed array)是ECMAScript新增的结构,目的是提升向原生库传输数据的效率。实际上,JavaScript并没有“TypedArray”类型,它所指的其实是一种特殊的包含数值类型的数组。为理解如何使用定型数组,有必要先了解一下它的用途。 6.3.1 历史    

    2024年01月19日
    浏览(33)
  • python笔记:第六章函数&方法

    由系统提供,直接拿来用或是导入模块后使用 函数是结构化编程的核心 使用 def 来定义函数 为函数添加文档字符串 如果不自定义返回值,则无返回值 return 用明确的变量组来接受函数输出值,便于后期查看(序列解包),不用元组 标明函数的返回值 注意:这

    2024年02月13日
    浏览(44)
  • 线代第六章 二次型 复习笔记

    二次型是一个多元函数 f (x1,x2,…,xn),每一项都是二次的,未知数的个数为任意个。 二次型可以写成矩阵形式(三个矩阵相乘): f (x1,x2,…,xn)   中间的矩阵A是对称矩阵,A称为二次型f 的对应矩阵。 矩阵A的秩称为二次型的秩。r(f)=r(A) 已知二次型,怎么写出二次型的对应矩阵

    2024年02月13日
    浏览(40)
  • 计算机网络-笔记-第六章-应用层

    一、第一章——计算机网络概述 二、第二章——物理层 三、第三章——数据链路层 四、第四章——网络层 五、第五章——运输层 六、第六章——应用层 目录 六、第六章——应用层 1、应用层概述 2、(C/S)客户-服务器方式 (P2P)对等方式 (1)客户-服务器方式【C/S】 (2)

    2024年02月10日
    浏览(45)
  • Vue笔记【动力节点】第六章路由route

    传统web应用 传统web应用,又叫做多页面web应用:核心是一个web站点由多个HTML页面组成,点击时完成页面的切换,因为是切换到新的HTML页面上,所以当前页面会全部刷新。 单页面web应用(SPA:Single Page web Application) 整个网站只有一个HTM页面,点击时只是完成当前页面中 组件

    2024年02月01日
    浏览(34)
  • 《Flink学习笔记》——第六章 Flink的时间和窗口

    6.1 时间语义 6.1.1 Flink中的时间语义 对于一台机器而言,时间就是系统时间。但是Flink是一个分布式处理系统,多台机器“各自为政”,没有统一的时钟,各自有各自的系统时间。而对于并行的子任务来说,在不同的节点,系统时间就会有所差异。 我们知道一个集群有JobMana

    2024年02月11日
    浏览(40)
  • 算法设计与分析复习笔记第六章分支限界法

    分支限界法的基本思想 分支限界法类似于回溯法,也是一种在问题的解空间树T中搜索问题解的算法。 但在一般情况下,分枝限界法与回溯法的求解目标不同。回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分枝限界法的求解目标则是找出满足约束条件的一个

    2024年02月03日
    浏览(46)
  • 【UnityShader入门精要学习笔记】第六章(1)Unity中的基础光照

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 一个物体为什么看起来是红色的?从物理上解释是因为这个物体

    2024年03月22日
    浏览(49)
  • 《计算机网络:自顶向下方法》学习笔记——第六章:链路层

    两种截然不同类型的链路层信道 广播信道 :这种信道用于连接有线局域网、卫星网和混合光纤同轴电缆接入网中的多台主机。 点对点通信链路 :这在诸如长距离链路连接的两台路由器之间,或用户办公室计算机与它们所连接的邻近以太网交换机之间等场合经常能够发现。

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包