Rust in Action笔记 第六章 内存

news2024/11/16 9:29:58
  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)是如何加载到虚拟内存并运行的过程在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBatch从入门到实战(三):多步骤控制

一&#xff1a;if else案例 案例&#xff1a;如果开始步骤成功了就执行成功步骤&#xff0c;否则执行失败步骤。 // 伪代码 String exitStatus helloWorldJob(); if("FAILED".equals(exitStatus)){failStep(); }else{successStep(); }Configuration public class …

01 面向对象方法的概念

面向对象方法的概念 1、什么是面向对象? 面向对象不仅仅是一种程序开发方法 使用面向对象程序设计语言 使用对象、类、继承、封装、消息等基本概念进 行编程 面向对象是一种软件方法学 如何看待软件系统与现实世界的关系 以什么观点进行求解 如何进行系统构造 2、面向对象方…

chatgpt赋能python:Python导入自己写的包详解

Python导入自己写的包详解 在Python中&#xff0c;我们可以将代码封装成包来重复利用&#xff0c;也可以将自己写的包分享给其他人使用。但是&#xff0c;在使用自己写的包时&#xff0c;如何进行导入呢&#xff1f; 什么是包&#xff1f; 在Python中&#xff0c;包是一个有…

计算机网络(更新中)

本文是个人笔记&#xff0c;都是概念&#xff0c;没基础不建议看。 绪论 计算机网络的定义 最简单的定义&#xff1a;计算机网络是一些互相连接的、自治的计算机的集合因特网&#xff08;Internet&#xff09;是“网络的网络” 计算机网络的组成&#xff08;物理组成&#x…

git从http切换到ssh

git从http切换到ssh 之前项目代码git clone的http的git地址&#xff0c;后来禁用了http协议&#xff0c;只能用ssh协议。 1. 生成ssh公钥 进入Git Bash Here, 执行以下命令 ssh-keygen -m PEM -t rsa -b 4096 -C "your.emailemail.com"一直Enter直到完成。 2. 添加…

个人对几个IDE的看法

&#xff08;说明&#xff1a;本文仅表达个人看法&#xff0c;实际上文中的几个IDE功能不同&#xff0c;不能互相取代。截图上的程序均已发布&#xff09; 个人认为一款IDE在功能完整的前提下&#xff0c;应当做到操作简便。另外&#xff0c;对缩放的兼容性也会影响观感。以下…

微服务springcloud 01 sts环境,maven管理,和springcloud简介,通用模块commons

01.使用的环境是sts和maven。 02.介绍springcloud springcloud是一个大的微服务框架。 03.Spring cloud对比Dubbo Dubbo Dubbo只是一个远程调用(RPC)框架;默认基于长连接,支持多种序列化格式 Spring Cloud 框架集&#xff0c;提供了一整套微服务解决方案(全家桶);基于http调用…

【数据挖掘实战】——科大讯飞:跨境广告ROI预测

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…

云服务器上使用Docker Compose创建Redis三主三从集群

一、环境 云服务器Ubuntu20.4Dokcer 24.0.2 二、步骤 目录结构是这样&#xff1a; 绿色的目录是用来存储容器中的文件&#xff0c;不需要我们手动创建&#xff0c;将路径配置在配置文件中即可。褐色的目录和文件需要自己手动创建。 我们一共创建7个容器&#xff1a; redis…

RabbitMq消息堆积问题及惰性队列

消息堆积问题 当生产者发送消息的速度超过了消费者处理的速度&#xff0c;就会导致队列的消息堆积&#xff0c;知道队列存储消息达到上限。最早接受的消息&#xff0c;可能就会成为死信&#xff0c;会被丢弃&#xff0c;这就是消息堆积问题。 解决消费对接问题 1.增加更多的消…

Hive执行计划之只有map阶段SQL性能分析和解读

文章目录 概述1.不带函数操作的select-from-where型简单SQL1.1执行示例1.2 运行逻辑分析1.3 伪代码解释 2.带普通函数和运行操作符的普通型SQL执行计划解读2.1 执行计划解读2.2 伪代码解释逻辑 概述 可能所有的SQLboy刚接触SQL语句的时候都是select xxx from xxx where xxx。在…

如何分析问题、找到性能瓶颈、掌握性能调优?一文讲懂性能测试

背景 当下云计算、大数据盛行的背景下&#xff0c;大并发和大吞吐量的需求已经是摆在企业面前的问题了&#xff0c;其中网络的性能要求尤为关键&#xff0c;除了软件本身需要考虑到性能方面的要求&#xff0c;一些硬件上面的优化也是必不可少的。 作为一名测试工作者&#xf…

Ubuntu18.04 离线安装gcc,g++,make依赖包

1. 离线安装背景 因为项目现场的服务器无法连接互联网&#xff0c;只有内网环境&#xff0c;但是需要安装redis和nginx&#xff0c;所以需要安装gcc,g,make等依赖包。 2. 如何获取依赖包 需要准备一台可以连接互联网的电脑&#xff08;如&#xff1a;个人电脑上的虚拟机安装一…

Java网络开发(Asynchronous异步)—— 从 Jsp 到 Ajax 的 axios 到 vue 同步请求 到 异步请求

目录 引出如果想做bilibili边看视频边评论怎么搞&#xff1f;Ajax是啥&#xff1f;& axios的语法1. Ajax&#xff08;Asynchronous JavaScript And XML&#xff09;简介2. axios语法 及其与 java后端交互&#xff08;1&#xff09;get请求&#xff08;2&#xff09;post请求…

海外社媒营销揭秘:品牌出海的关键策略与注意事项

在全球化的背景下&#xff0c;品牌出海已成为众多企业拓展市场的必然选择。而海外社媒营销作为一种有效的推广手段&#xff0c;不仅能够帮助品牌建立海外影响力&#xff0c;还可以增强品牌知名度、提高销售额。然而&#xff0c;要在海外社媒平台上实施成功的营销策略&#xff0…

网络安全零基础都能看的SQL注入

1.1 .Sql 注入攻击原理 SQL 注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一&#xff0c;它也是目前被利用得最多的漏洞。要学会如何防御 SQL 注入&#xff0c;首先我们要学习它的原理。 针对 SQL 注入的攻击行为可描述为通过在用户可控参数中注入 SQL 语法&#x…

高压脉冲电源和高压放大器应用领域的区别

在之前的科普中我们讲解了高压脉冲电源和高压放大器的定义及二者区别&#xff0c;其实除此之外&#xff0c;它们在应用上也是有不同倾向性的&#xff0c;那么今天让安泰测试Agitek为大家分享高压脉冲电源和高压放大器应用领域究竟有什么不同&#xff1f; 高压脉冲电源的应用领…

躺不平摆不烂的测试员如何自救?

随着测试从业年龄的增加&#xff0c;毕业的概率大增&#xff0c;而机会骤减&#xff0c;从而使测试员陷入躺不平、摆不烂的状态。 相较于开发员&#xff0c;测试员是没有资格躺平的&#xff0c;毕竟测试员没可能从短短几年黄金时间&#xff0c;从工作中积累到足以躺平的财富&a…

wordpress去除分类URL的categpory

前言 在日常使用Wordpress搭建网站时&#xff0c;发现文章或者分类页的URL地址中默认带有Category&#xff0c;URL层级过长会影响我们网站SEO的优化&#xff0c;也不利于用户体验。这里讲一下如何去除URL中categpory的方法。 操作 第一步先登录到WordPress后台&#xff0c;然…

前端样式网站(前端css框架)

1. Bootstrap:Bootstrap The most popular HTML, CSS, and JS library in the world.Bootstrap 是最流行的 CSS 框架,提供了丰富的前端样式和组件,非常适合开发响应式网站和应用程序。 2. Bulma:Bulma: Free, open source, and modern CSS framework based on FlexboxBulma 是…