首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

1.3 rust之——你真的了解堆栈吗?

本来预计这篇文章是要说rust的基本数据类型的,但还是先让我们简单回顾下关于内存的一些基本知识,最主要还是为后期讲到rust的所有权、借用、生命周期等概念时,不迷糊。好多人可能会说:“这有什么好讲的,早就知道的八股文,new出来的在堆上,其他的基本在栈上”。好像也有道理,不过,我还是倔强地要从main()函数来说起 :D

程序从main函数开始执行,第2行“hello world”这个字符串常量,在程序运行时,是在data段,有一个固定的内存地址,在"to_string()"被执行就会在堆上分配一块新内存,逐字节拷贝”hello world”到新内存地址。当这个地址的值被赋给“str”变量的时候,这个“str”变量是在栈上分配的,所以最终第2行代码执行的结果,就是在栈上分配了一个“str”变量,他的值就是堆上“hello world”这个字符串常量的地址!除此之外他还会保存字符串常量的长度和这块堆内存的大小,也就是容量。

从这个例子再概述一下栈:我们知道栈是自顶向下增长,从main()函数执行的函数一层一层调用,栈会向下扩展,局部变量的内存空间也会在编译时确定,才能预留空间。而编译时候不能确定内存大小,亦或是大小可变的数据,就只能放在堆上了,否则运行时可能会造成栈溢出(一般栈内存就8M~~)。也就是说:栈存的值是肯定在编译期就确定大小的,静态的,生命周期固定的;而堆上储存的数据一般是动态、大小不固定和生命周期不固定的。

而堆可以在运行时灵活分配内存,灵活控制生命周期,是不是感觉超棒:),其实不然。堆的内存申请和释放都需要很大的系统开销,频繁地IO会造成巨大的性能损耗。而且需要配对使用new与delete,有开发经验的都知道中间如果出现异常就会造成内存泄漏,如果程序很大的话,最后内存用光了就只能崩溃啦~,除此之外还有野指针问题也是程序代码中容易出现的错误,所以有人说C是属于信任开发人员,把内存都交给我们开发自己灵活控制,但奈何谁都有一个由菜鸟到大神的过程,不能是一开始就很正确地管理内存。

正是因为这些问题,有GC管理的java等语言学起来感觉会比C++更容易,并且java的生态、库也很多,给我们开发人员更多称手的工具,提高开发效率。额~~ 等等,我们这是一个介绍rust的文章 :D

那么rust号称是没有GC,还不用我们开发人员自己手工管理内存的语言,也就不会有GC造成的性能问题。那他是怎么做到的呢?他就会用到我们后期将认识的:可变的借用、不可变的引用、生命周期等特性~

好了,今天我们回顾了一些些编程地基础知识堆栈,从main()函数运行时开始说起堆栈地调用。同时也加强了解了堆栈上分别放那种数据,他们的特点。对于今天的内容你有什么看法呢?欢迎在评论区留言讨论!如果觉得文章有用,记得点赞关注加收藏,以后就会第一时间收到文章推送啦 :D

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230203A05W3N00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券