1000万云上开发者,全栈云产品0元试用:点击 免费试用 ,即刻开启云上实践之旅!
本文详细描述了Rust内存分布的基础知识,并且配上了不少图片帮助理解。
(相关资料图)
作者 | 吴超(律霜)
来源 | 阿里开发者公众号
Rust作为一门学习曲线十分陡峭的语言,掌握其核心基础数据结构的内存分布对学习Rust会有很大的帮助,即使对于已经熟悉Rust的同学,深入数据结构分布也能帮助到调优Rust程序。
接下来,我会由浅入深仔细介绍Rust的各个数据结构在内存中的分布情况,帮助大家学习Rust。
先决条件 Prerequisite
在开始介绍之前,我们先做这个几个假设,来更好地帮助后续文章的展开。
我们本文的机器预设是32位的(主要为了画图可以精简一点),所有和位相关的数据结构均会用上标标记(即这些数据结构占用的是1 machine word)。例如:usize32 数据结构基本单位示图:蓝色的框框代表1个byte,绿色的框框pointer下的(1|2|3|4)代表pointer在32位机器上rust是4个byte,他们整体被框在绿色框框中代表一个pointer。
1 基本类型
不用害怕,让我们把一只小脚试探性地迈入Rust的大门,先看看基础类型的内存分布吧。
这些数据结构Rust分配的时候都是在栈上的。
1.1 Stack栈 vs Heap堆
因为本文会涉及到Rust中栈和堆分配,本小章先来简单讲一下栈和堆。
我们只提炼一些最基本的区别概要,更多的细节可以看这篇文章有比较好的解释。
栈特点:
分配快 大小受限堆特点:
分配慢 大小不受限2 元组 Tuple
让我们先从比较基础的Rust数据结构Tuple看起。
let a:(char, u8, i32) = ("a", 7, 354);size_of::<(char, u8, i32)>(); // 打印结果 12align_of::<(char, u8, i32)>(); // 打印结果 4该元组由三个元素构成——char、u8和i32,由1 基本类型中可知char占4 bytes,u8占1 byte, i32占4bytes,那么初步计算出来这个tuple占用的总内存应为4+1+4 = 9 bytes。接着,Rust会选择Tuple中对齐值最大的元素为a该元组的对齐值,由此上例alignment是4。有了整体对齐值,Rust会在内存中加入一段填充(padding)来让整体内存占用是alignment的整数倍,本例中加在u8与i32中间是为了保障i32自身的内存对齐。
由于Rust有多种数据排布风格(默认的Rust风格,还有C语言风格,primitive和transparent风格),在Rust风格中,Rust可以对元组中的元素做任意重排,也包括padding的位置,因而图中的排列只是一种可能,也许i32和char的位置在Rust中会进行互换,Rust是根据其优化算法做出其认为最优的排序,对最终排序结果并没有统一规则。
上图为该tuple的内存分布图。
3 引用 Reference
引用 reference 是Rust中的一个重要概念,相关规则也是支撑了Rust内存安全的重要支柱。我们来看下面的例子。
let a: i8 = 6;let b : &i8 = &a;a 是一个i8,b是一个指向a的reference,我们可以看下他俩的内存分布。
首先,Rust会在栈上分配一个大小为1byte的i8存储a,接着会在内存另外一个空间(不一定和a连续)分配b,b中存储的内存空间会指向a所在的内存空间,同时b的内存占用大小即pointer的大小。
需要注意的是,&T和&mut T在内存分布上规则一致,他们的区别是在使用方式和编译器处理方式上。
4 Array数租 和 Vector动态数组
接下来我们来看看Rust的数组Array和动态数组Vector的内存分布,以下面的数组和动态数组为例。
let a: [i8; 3] = [1, 2, 3];let b: Vec= vec![1, 2, 3]; 数组Array是固定大小的,所以在创建的时候都指定好了长度;动态数组Vector,由其名字就可以知道他是可以自由伸缩的,那么我们来看看Rust是怎么在内存上存储这两位数据结构的。
对于Array a,由于他固定大小为3个i8,Rust即在栈上为其分配了3 * 1 byte个内存。
对于Vector b就有点特殊啦,他会由如下三个部分组成:
pointer : pointer b会指向vector b在堆上的实际数据(目前是1, 2, 3 共3 * 1 byte), cap(图中上标32代表这个值和机器位数有关,最后复习一次哦): cap代表最多多少个T(本例中T是i8)的内存可以在堆上让这个动态数组使用,默认大小为创建时的T个数,可根据使用需求自动扩容,但每次扩容时会带来reallocate影响到性能。 len (1 machine word),代表目前有多少个T(本例中T是i8)的内存真实被该动态数组使用。以上即可看到数组和动态数组由于在“动态”这个特点上的不同,出现的内存分布差异啦。
4.1 Slice 数组切片
接下来,我们通过Array和Vector来看下Rust中切片的内存分布实现。
假设我们想获取到上面例子中a和b两个Array和Vector的前两个元素。
let slice_1: [i32] = a[0..2];let slice_2: [i32] = b[0..2];然而,对于[i32],Rust没法在编译时明确这个变量需要多少内存,因而也没法在栈上分配内存,因而上例中的slice_1和slice_2实际上会编译失败。这样的变量称之为dynamically sized type,后续会讲到string slice和trait object也属于这个范畴。
因而,通常我们使用一个reference来指向一个Slice切片,让我们看下例
let slice_1: &[i32] = &a[0..2]let slice_2: &[i32] = &b[0..2]当reference指向dynamically sized type时,Rust实际会使用到一个胖指针(fat pointer),其中包含:
pointer (1 machine word): 指向实际被切片的数据。 length (1 machine word): 切片长度,即有多少个T(本例中T为i32)。我们可以看下上述例子的内存分布图。
5 String, str, &str
接下来让我们来看下String, str 和&str的内存分布。以一个例子开始吧。
let s1: String = String::from(“HELLO”);let s2: &str = “ЗдP”; // д ->Russian Languagelet s3: &str = &s1[1..3];首先,s1是一个String,String实质上就是Vec的一个包装,其中也是在栈上有一个指针 + cap( 1 machine word ) + len ( 1 machine word ),指针指向了该String实际在堆上的值。String是保证UTF-8兼容的。
如果我们直接在变量中存了一个字符串字面值(string literal),例如s2,那么这个变量会是一个指向string slice的指针。这个string数据不会存储在堆heap上,而是会直接存在编译后的二进制中,同时他们具有static生命周期,即直到程序结束前都不会被释放。 如同前面讲的slice以后,&str也同样是个胖指针,同时包含了实际数据的内存地址和数据长度(一共2 machine words)。这里的例子里用了一个特殊字符д,由于UTF-8是一种可变长的编码方式,这里可以看到д就用了2个byte来表达。
剩余60%,完整内容请点击下方链接查看:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
关键词:
(责任编辑:黄俊飞)推荐内容
- 淘宝店铺名称可以修改吗?在哪里改? 每
- 满坤科技:公司产品的研发、生产及应用暂
- 今日看点:中国证监会对集海资源出具境外
- 重点聚焦!《中沙群岛造礁石珊瑚》出版
- 世界热资讯!法律规定拆迁被打怎么办?
- 丰元股份7月3日盘中涨幅达5% 热门看点
- 油画雕塑领域的“新青年”们 又有哪些新
- 离岸人民币兑美元较日低反弹约200点
- 天天新资讯:南非祖鲁王疑遭投毒正接受治
- 教你如何修复msgsvc.dll丢失 每日焦点
- iphone4s手机铃声最好(iphone4s手机铃声
- 矢志不渝飞天 卅年奋斗梦圆(科技名家
- 酸菜碎肉干捞粉,南宁夏天的必选美食,爽
- 腾龙健康IPO:境外销售占比超八成藏风险
- 最新!芦恒路新建工程迎来重要节点,预计
- 胡望明与宝武在鄂单位负责人座谈交流,提
- 环球观点:桂林大学生遇难_5名大学生死亡
- 12567910打一成语(1256789打一成语)
- 中金:港股市场迎接关键政策窗口期-天天
- 致公堂
- 广州白云湖上“群龙争霸”!白云区龙舟邀
- 比亚迪混动汽车哪款好_比亚迪混动汽车有
- 百胜中国(09987.HK):6月30日耗资约100万
- 中通客车:预计上半年净利润同比增长82%-
- 热门:迎峰度夏电力保供有坚实基础 多个
- 鸿星尔克两个商标的区别_严厉打击侵权假
- 仲春上浣(仲春)
- 小麻雀怎么养才能养活_小麻雀应该吃什么虫
- 价格触底了!4TB梵想PCIe4固态破千
- 北京中外服_北京外服进口时装有限公司相
- 首届亚洲霹雳舞锦标赛在杭州开幕 上演世
- 157轮竞拍!台州一热门地块拍出9.64亿元
- 7.85亿元!史上第二贵肖像画诞生:克林姆
- 中国海水入侵的主要原因是什么-焦点
- 7档双离合手自一体是什么意思 七档双离
- 大学生如何担当民族复兴大任论文_青少年
- 快讯2023-07-01 23:23:51-世界快播
- 天天即时:燃!久久不见,海南“村VA”球
- 湘潭:深化合作交流 构建研学体系-天天
- 头条:极氪 6 月交付破万 极氪 001
- 蹦蹦,是转职成辣妹的小时! 今日关注
- 潘功胜任央行党委书记
- 电脑电源接通但未充电解决办法(电脑电源
- 施工资料由哪八项资料组成_施工资料包括
- 翼神传说OVA_关于翼神传说OVA介绍-天天报
- 【环球快播报】皮蛋瘦肉粥的详细配料及做
- 全球快看点丨国家发改委主任郑栅洁:坚决
- 快资讯:切实做好全市民政系统火灾防控工
- 财联社创投通:一级市场本周94起融资环比
- 前沿热点:六级难度是4级的几倍_六级英语
- 工会送清凉 防暑保安康|广东工会:“智
- 西平县文广旅局开展文化市场综合执法“闪
- 云南文旅登场西旅会 政企合作文旅融合
- 小鸡宝宝考考你不小心把水银体温计摔碎后
- 股票行情快报:海螺新材(000619)6月30
- 变异性咳嗽哮喘能根治吗_哮喘能根治吗-天
- 世界动态:最高时速350公里!广西这条铁路
- 三国演义人物分析曹操_三国演义人物分析
- 每日热讯!各地多措并举为高校毕业生拓岗
- 快看点丨苍兰诀的男主(徐海乔说苍兰诀结
- 广州白云湖上“群龙争霸”!白云区龙舟邀
- 比亚迪混动汽车哪款好_比亚迪混动汽车有
- 百胜中国(09987.HK):6月30日耗资约100万
- 中通客车:预计上半年净利润同比增长82%-
- 热门:迎峰度夏电力保供有坚实基础 多个
- 鸿星尔克两个商标的区别_严厉打击侵权假
- 仲春上浣(仲春)
- 小麻雀怎么养才能养活_小麻雀应该吃什么虫
- 价格触底了!4TB梵想PCIe4固态破千
- 北京中外服_北京外服进口时装有限公司相
- 首届亚洲霹雳舞锦标赛在杭州开幕 上演世
- 157轮竞拍!台州一热门地块拍出9.64亿元
- 7.85亿元!史上第二贵肖像画诞生:克林姆
- 中国海水入侵的主要原因是什么-焦点
- 7档双离合手自一体是什么意思 七档双离
- 大学生如何担当民族复兴大任论文_青少年
- 快讯2023-07-01 23:23:51-世界快播
- 天天即时:燃!久久不见,海南“村VA”球
- 湘潭:深化合作交流 构建研学体系-天天
- 头条:极氪 6 月交付破万 极氪 001
- 蹦蹦,是转职成辣妹的小时! 今日关注
- 潘功胜任央行党委书记
- 电脑电源接通但未充电解决办法(电脑电源
- 施工资料由哪八项资料组成_施工资料包括
- 翼神传说OVA_关于翼神传说OVA介绍-天天报
- 【环球快播报】皮蛋瘦肉粥的详细配料及做
- 全球快看点丨国家发改委主任郑栅洁:坚决
- 快资讯:切实做好全市民政系统火灾防控工
- 财联社创投通:一级市场本周94起融资环比
- 前沿热点:六级难度是4级的几倍_六级英语
- 工会送清凉 防暑保安康|广东工会:“智
- 西平县文广旅局开展文化市场综合执法“闪
- 云南文旅登场西旅会 政企合作文旅融合
- 小鸡宝宝考考你不小心把水银体温计摔碎后
- 股票行情快报:海螺新材(000619)6月30
- 变异性咳嗽哮喘能根治吗_哮喘能根治吗-天
- 世界动态:最高时速350公里!广西这条铁路
- 三国演义人物分析曹操_三国演义人物分析
- 每日热讯!各地多措并举为高校毕业生拓岗
- 快看点丨苍兰诀的男主(徐海乔说苍兰诀结
- 为何蜀戏冠天下?“梅花”陈智林刘谊与香
- 营造拥军爱军浓厚氛围 城步县举办国防教
- 当前资讯!老农出门拾粪遇大汉奸,怒而将
- 当前快讯:纬创斥资9.99亿新台币入股芯片
- 莱茵生物:公司天然甜味剂主要从甜叶菊、
- 石榴木命好不好(命运发展如何)-热点评
- 中小学幼儿园学生“暑期陪伴计划”出台
- 天天热议:IneosGrenadierQuartermaster皮
- 吉林省小学生篮球联赛总决赛在长开赛 焦
- A股异动|中药股冲高 莱茵生物涨停
- 美联邦最高法院裁定大学招生不得考虑种族
- 马云出山,淘宝变革,中小商家的机会来了
- 全球短讯!华达科技:6月29日获融资买入4
- 每日简讯:wcdma是什么网络制式_wcdma是
- 拍卖行拍出假艺术品后不认怎么办? 鉴定
- 【环球报资讯】下半年股价有望“翻倍”股
- 一岁半宝宝食谱100例_一岁半宝宝食谱_天
- 黄磊豆腐花做法?
- 【全球独家】全职高手dnd_全职高手dnf
- 血糖高怎么办什么方法降最好_血糖高怎么

(相关资料图)














