1691|13

5084

帖子

236

TA的资源

管理员

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

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

活动交流群

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

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

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽

最新回复

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

回复
举报

2055

帖子

0

TA的资源

五彩晶圆(初级)

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

点评

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

回复

248

帖子

0

TA的资源

一粒金砂(高级)

问:

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

点评

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

回复

40

帖子

0

TA的资源

一粒金砂(中级)

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

点评

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

回复

168

帖子

10

TA的资源

一粒金砂(高级)

为什么栈会比堆快呢?

点评

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

回复

40

帖子

0

TA的资源

一粒金砂(中级)

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

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


回复

40

帖子

0

TA的资源

一粒金砂(中级)

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

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


回复

168

帖子

10

TA的资源

一粒金砂(高级)

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

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


回复

4127

帖子

12

TA的资源

版主

实战问题:

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

回复

556

帖子

1

TA的资源

纯净的硅(中级)

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

到底是栈快还是堆快?

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

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


回复

29

帖子

1

TA的资源

一粒金砂(中级)

吾妻思萌 发表于 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" 这个字符串的实际字符数据存储在堆上。

 


回复

434

帖子

4

TA的资源

纯净的硅(高级)

做个小总结:

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

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

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

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


回复

2803

帖子

4

TA的资源

五彩晶圆(中级)

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

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

点评

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

回复

556

帖子

1

TA的资源

纯净的硅(中级)

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

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

 


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

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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

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

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

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