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中,使用堆是安全的;
    表6.1
  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)是如何加载到虚拟内存并运行的过程在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【kubernetes】Etcd集群部署与验证

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

基于OpenMV的自动驾驶智能小车模拟系统

一、项目简介 基于机器视觉模块OpenMV采集车道、红绿灯、交通标志等模拟路况信息&#xff0c;实现一辆能车道保持、红绿灯识别、交通标志识别、安全避障以及远程WiFi控制的多功能无人驾驶小车。 赛道规格&#xff1a; 1、编程所需软件&#xff1a; OpenMV&#xff1a;使用Op…

Python自动化测试框架:Pytest和Unittest的区别

pytest和unittest是Python中常用的两种测试框架&#xff0c;它们都可以用来编写和执行测试用例&#xff0c;但两者在很多方面都有所不同。本文将从不同的角度来论述这些区别&#xff0c;以帮助大家更好地理解pytest和unittest。 1. 原理 pytest是基于Python的assert语句和Pytho…

Git第二章、多人协作

一、多人协作一 目前&#xff0c;我们所完成的工作如下&#xff1a; • 基本完成 Git 的所有本地库的相关操作&#xff0c;git基本操作&#xff0c;分支理解&#xff0c;版本回退&#xff0c;冲突解决等等 • 申请码云账号&#xff0c;将远端信息clone到本地&#xff0c;以及推…

一种基于目标的可解释的自动驾驶预测和规划策略

摘要&#xff1a; 本文介绍了一种通过理性逆向规划进行目标识别和多模态轨迹预测的方法。通过将目标识别与MCTS 计划相结合&#xff0c;为自车生成优化计划。 最近炒得比较火的影子模式实际就是在通过数据收集的方式不断模拟自动驾驶系统按照人类驾驶习惯实现人之间的交互过程…

Qt 中动态加载窗口(C++)

在编程中&#xff0c;我经常会遇见要根据用户触发按钮&#xff0c;动态生成窗口的情况。在此有两种方法可以动态生成窗口&#xff1a;一&#xff1a;直接在槽函数中调用窗口类。二&#xff1a;将 **.ui 添加到资源文件&#xff0c;通过 QUiLoader 加载。 现将两种方法介绍如下…

linuxOPS系统服务_Linux下用户管理

用户概念以及基本作用 **用户&#xff1a;**指的是Linux操作系统中用于管理系统或者服务的人 一问&#xff1a;管理系统到底在管理什么&#xff1f; 答&#xff1a;Linux下一切皆文件&#xff0c;所以用户管理的是相应的文件 二问&#xff1a;如何管理文件呢&#xff1f; …

【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

&#x1f3c6;&#x1f3c6;时间过的真快&#xff0c;这是导师回顾新星计划学习的第六篇文章&#xff01; 最近这段时间非常忙&#xff0c;虽然导师首次参与新星计划活动已经在4月16日圆满结束&#xff0c;早想腾出时间来好好整理活动期间分享的知识点。 &#x1f3c6;&#x1…

Unsupervised Learning(无监督学习)

目录 Introduction Clustering&#xff08;聚类&#xff09; Dimension Reduction&#xff08;降维&#xff09; PCA&#xff08;Principle component analysis&#xff0c;主成分分析&#xff09; Word Embedding&#xff08;词嵌入&#xff09; Matrix Factorization(矩…

适合嵌入式开发的GUI(嵌入式学习)

嵌入式开发的GUI如何选择&#xff1f; 常见的嵌入式GUI开发方法轻量级GUI库优缺点 基于Web技术优缺点 Qt框架优缺点 原生开发优缺点 嵌入式系统的限制 常见的嵌入式GUI开发方法 嵌入式开发中的GUI&#xff08;图形用户界面&#xff09;是指在嵌入式系统中实现图形化的用户界面…

Linux权限管理(超详解哦)

Linux权限 引言文件访问者的分类文件类型与访问权限文件类型访问权限 文件权限值的表示方法修改权限的指令chmod修改文件权限通过角色/-/权限来修改通过三个八进制数修改 chown修改所有者chgrp修改所属组umask修改或查看文件权限掩码文件创建时的权限 目录的权限粘滞位 总结 引…

驱动模块和printk函数

目录 1. 驱动模板 1.1. 在源码工程路径下创建.c文件 1.2. 编写驱动模板 1.3. 将模板放到ubuntu上 1.4. 书写Makefile 1.5. 编译和安装 2. printk 2.1. Source Insight查找命令 2.2. printk讲解 2.2.1. 分析函数 2.2.2. 编写代码 2.3. 拓展 2.3.1. 关于printk函数测…

ESP32开发环境搭建Windows VSCode集成Espressif IDF插件ESP32_IDF_V5.0开发编译环境搭建

一、安装ESP32-IDF库 下载网址&#xff1a;https://dl.espressif.com/dl/esp-idf/ 打开上面的网页&#xff0c;选择单击页面中 ESP32-IDF v5.0.2 - Offine Installer&#xff0c;5.0.2是当前最新版本&#xff0c;如果没有ESP32-IDF v5.0.2 - Offine Installer&#xff0c;说明…

ADB WIFI 链接

ADB WiFi链接手机 必须在同一网络下&#xff08;本人用的台式机网线手机连路由器WIFI&#xff09; 1.先确认USB数据线是否成功链接了手机 adb devices不管前面设备是什么名字&#xff0c;但是后面必须为device状态才算链接成功了&#xff0c;offline状态是不行的 有些没开启…

《微服务架构设计模式》第二章 服务的拆分策略

内容总结自《微服务架构设计模式》 服务的拆分策略 一、架构是什么软件架构的41视图模型为什么重要分层架构风格 二、定义微服务如何定义服务拆分难点定义服务API 一、架构是什么 软件架构的定义&#xff1a;计算机系统的软件架构是构建这个系统所需要的一组结构&#xff0c;包…

物联网Lora模块从入门到精通(八)Lora无线通信

一、前言 在某些环境下&#xff0c;无法通过有线传输数据&#xff0c;这时候我们需要使用Lora无线通信传输数据&#xff0c;Lora无线数据传输具有低功耗、距离长的特点&#xff0c;常用于工厂内等&#xff0c;需要Lora基站。 我曾做过距离测试&#xff1a;Lora模块距离测试-物联…

Linux---vim的使用

专栏&#xff1a;Linux 个人主页&#xff1a;HaiFan. 本章为大家带来Linux工具—vim Linux工具 关于rzszyumvim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集简单vim配置配置文件的位置常用配置选项 关于rzsz 这个工具用于windows机器和Linux机器通过Xshell传输…

PHP伪协议filter详解,php://filter协议过滤器

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 php://filter 一、访问数据流二、过滤数据流三、多…

electron 快速创建一个本地应用

参考官方文档流程 快速入门 | Electron 建议先全局安装electron&#xff0c;npm install -g electron 开发过程中可以在本地开发安装 使用electron快速创建一个web页面 &#xff0c;参考官方demo 实例 electron-quick-start 第一步&#xff1a; mkdir my-electron-app &am…

Linux

Linux 摘要写在前面1.Linux介绍2.Linux基本概念与命令3.Shell编程4.桌面操作系统框架5.GTK图形编程6.QT图形编程7.DBUS8.GDB9.Wine开发10.高可用存储技术11.高可用网络技术12.云计算 摘要 本篇博客参考中科方德国产操作系统的培训课程&#xff0c;对其主要内容进行总结&#x…