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日
    浏览(36)
  • 第六章 集合引用类型(中)——定型数组

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年03月22日
    浏览(35)
  • 动力节点Redis7笔记-第六章Redis分布式系统

    Redis分布式系统,官方称为Redis Cluster,Redis集群,其是Redis 3.0开始推出的分布式解决方案。其可以很好地解决不同Redis节点存放不同数据,并将用户请求方便地路由到不同Redis的问题。 分布式数据库系统会根据不同的数据分区算法,将数据分散存储到不同的数据库服务器节点上

    2024年02月07日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包