4064|13

5261

帖子

239

TA的资源

管理员

楼主
 

《Rust实战》书友互动第六集:内存,有啥你不熟悉的吗? [复制链接]

 
上一集,书友们互动问答,深入理解数据,这一集,我们将走入“内存”主题,看目录,指针、堆、栈、动态内存、虚拟内存,似乎都是熟悉的概念在召唤,是不是轻松的一集呢?期待大家交流。
至此,书籍进度条已过半了,一起珍惜剩下携手的时间啦,期待最终一起收获成长。
 
 
演绎时间:即日起至5月26日
脚本限定:《Rust实战》第六章  内存
 
角色分配:
提问角色(4位)和解题角色(4位)、总结角色(2位),下方跟帖第一位书友嘉宾是提问角色,第二个是解题角色,解答第一个提问,解答完后,解题角色可以继续提问,也可以不提问,结束一次问答循环。后面参与继续新起问答接龙即可,最后2位是章节总结角色,以文字或者思维导图的形式,对本章进行总结,至此一次互动结束。注意:提问角色发布的问题,要求能在第四章节书中有迹可循,且对解题者理解、学习Rust有切实意义;提问角色所发布的问题不可重复。
 

活动交流群

论坛有开设嵌入式交流群,欢迎感兴趣的小伙伴,微信添加“helloeeworld”为好友,对话:加入嵌入式交流群,入群交流。

扫码,对话:加入嵌入式交流群。

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

最新回复

感谢bigbat老大详解stack和heap的差别!!让人豁然开朗!     详情 回复 发表于 2024-5-30 10:40
点赞 关注

回复
举报

2057

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

哪位大佬总结一下Rust管理内存有哪些方式?

点评

主要通过所有权、借用、生命周期等机制来实现。所有权机制确保在程序中只有一个所有者可以拥有并修改数据,避免了出现多个指针同时访问和修改同一块内存的情况,从而避免了常见的内存安全问题,例如空指针解引用、野  详情 回复 发表于 2024-5-23 10:42
 
 

回复

294

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

问:

rust最优越感的就是针对内存的处理了,可以说是确保了内存的安全性和线程安全性,那么rust与C语言的内存,有什么不同呢?

点评

在 C 语言中,需要手动管理内存,容易导致内存泄漏、野指针、缓冲区溢出等问题。而在rust中因为存在生命周期和所有权会在大括号结束的时候自动回收  详情 回复 发表于 2024-5-23 10:44
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

4
 

智能指针和其他编程语言的指针有何不同呢?

点评

简单说就是增加了一些安全特性,或者说是在Rust的安全限制下,能提供出允许使用指针的功能。  详情 回复 发表于 2024-5-23 10:45
 
 
 

回复

183

帖子

12

TA的资源

一粒金砂(高级)

5
 

为什么栈会比堆快呢?

点评

到底是栈快还是堆快? 栈如果是寄存器实现的话,当然会很快,但栈也可以通过软件实现,这样是不是就不会那么快了? heap在观念里,不是比stack更快吗?  详情 回复 发表于 2024-5-23 20:55
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

6
 
IC爬虫 发表于 2024-5-23 10:28 哪位大佬总结一下Rust管理内存有哪些方式?

主要通过所有权、借用、生命周期等机制来实现。所有权机制确保在程序中只有一个所有者可以拥有并修改数据,避免了出现多个指针同时访问和修改同一块内存的情况,从而避免了常见的内存安全问题,例如空指针解引用、野指针等。生命周期用于描述某个引用的有效期,在编译时检查引用是否合法。生命周期的存在使得 Rust 能够在编译阶段就能够发现潜在的内存安全问题,并防止出现空指针解引用等问题。还有就是跟C++一样的RAII机制

 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

7
 
yangjiaxu 发表于 2024-5-23 10:29 问: rust最优越感的就是针对内存的处理了,可以说是确保了内存的安全性和线程安全性,那么rust与C语言 ...

在 C 语言中,需要手动管理内存,容易导致内存泄漏、野指针、缓冲区溢出等问题。而在rust中因为存在生命周期和所有权会在大括号结束的时候自动回收

 
 
 

回复

183

帖子

12

TA的资源

一粒金砂(高级)

8
 
ltaodream 发表于 2024-5-23 10:34 智能指针和其他编程语言的指针有何不同呢?

简单说就是增加了一些安全特性,或者说是在Rust的安全限制下,能提供出允许使用指针的功能。

 
 
 

回复

4918

帖子

12

TA的资源

版主

9
 

实战问题:

let v1 = Vec::new();

let v2 = vec![1, 2, 3];

let s1 = "hello";

let s2 = string::from("Hello"):

如上四个那个在栈,哪个在堆呢?

点评

1、v1 和 v2 的结构存储在栈上,它们的数据(如果有)存储在堆上。 let v1 = Vec::new(); v1 是一个空的 Vec 实例。Vec 是一个动态数组,它在堆上分配内存来存储元素。即使这个 Vec 当前是空的,它仍然需要在  详情 回复 发表于 2024-5-24 09:38
 
 
 

回复

1375

帖子

1

TA的资源

五彩晶圆(初级)

10
 
nemon 发表于 2024-5-23 10:40 为什么栈会比堆快呢?

到底是栈快还是堆快?

栈如果是寄存器实现的话,当然会很快,但栈也可以通过软件实现,这样是不是就不会那么快了?

heap在观念里,不是比stack更快吗?

 
 
 

回复

45

帖子

1

TA的资源

一粒金砂(中级)

11
 
吾妻思萌 发表于 2024-5-23 11:06 实战问题: let v1 = Vec::new(); let v2 = vec![1, 2, 3]; let s1 = "hello"; let s2 ...

1、v1 和 v2 的结构存储在栈上,它们的数据(如果有)存储在堆上。

let v1 = Vec::new();

v1 是一个空的 Vec 实例。Vec 是一个动态数组,它在堆上分配内存来存储元素。即使这个 Vec 当前是空的,它仍然需要在堆上有一个表示自身的结构。因此,v1 的实际数据结构(包括指向堆上可能的元素的指针)存储在栈上,而它将来可能容纳的数据会存储在堆上。

let v2 = vec![1, 2, 3];

v2 是一个包含三个整数的 Vec。与 v1 类似,v2 的结构(包括指向数据的指针)存储在栈上,而具体的元素 [1, 2, 3] 则存储在堆上。

2、s1 存储在静态区域,不在栈或堆上。
let s1 = "hello";

s1 是一个字符串字面量,它在 Rust 中是不可变的,编译器会将其存储在只读的静态区域(通常认为是数据段的一个部分),这意味着它既不在栈也不在堆上,而是存在于程序的静态内存区域,生命周期与程序相同。。

3、s2 的结构存储在栈上,数据在堆上。

s2 是一个 String 实例,String 类型类似于 Vec,也是在堆上分配内存来存储其内容。因此,s2 的结构(包括长度、容量和指向实际字符串数据的指针)存储在栈上,而 "Hello" 这个字符串的实际字符数据存储在堆上。

 

 
 
 

回复

504

帖子

4

TA的资源

纯净的硅(高级)

12
 

做个小总结:

本章介绍了,指针,引用,内存地址的概念,其实就是一回事,从汇编语言去解释其实更容易理解,本文写的有点晦涩难懂,看了有点不知所以然,感觉本文的行文风格是为了显得浅显易懂,特意去举一些例子或者类比的语句,实际反而把问题搞复杂了,过犹不及,更加显得晦涩了,并没有一句话说清问题的本质。

然后介绍了智能指针,个人感觉不就是在指针的基础上封装增加额外的长度等信息吗? 不还是个指针吗,自己封装一下不就是了,所以还是在C基础上搞装修。

然后介绍了堆和栈的概念,这个其实要搞过嵌入式开发会比较深刻的理解

然后介绍了 内存,介绍了动态内存分配,虚拟内存的概念等,使用系统提供api进行内存操作

 
 
 

回复

2934

帖子

4

TA的资源

五彩晶圆(中级)

13
 

堆和栈都是内存区域,传统意义的变量其实质是小块内容区域,用来存放数据的区域,变量名称是这段内存区域的地址名称,存放变量的变量就是指针,理解了这一点才可以理解rust中的内存管理,堆和栈是两种使用方法不同的内存区域,堆:是存放全局和动态变量的内存,所以其管理和释放比较复杂,访问操作步骤繁琐,所以就慢。栈是直接分配给函数的区域,可以直接操作。速度就快。可以参考以下视频

【搞清楚内存泄漏-编程基础】

点评

感谢bigbat老大详解stack和heap的差别!!让人豁然开朗!    详情 回复 发表于 2024-5-30 10:40
 
 
 

回复

1375

帖子

1

TA的资源

五彩晶圆(初级)

14
 
bigbat 发表于 2024-5-28 09:25 堆和栈都是内存区域,传统意义的变量其实质是小块内容区域,用来存放数据的区域,变量名称是这段内存区域的 ...

感谢bigbat老大详解stack和heap的差别!!让人豁然开朗!

 

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表