您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

还有多少人搞不懂堆内存和栈内存的区别?

时间:2022-06-15 16:57:44  来源:  作者:linux技术栈

这篇文章分享一个面试中经常被问到的知识点:堆内存和栈内存有什么区别?平时开发应该使用堆内存还是栈内存?

要回答这个问题,我们首先需要知道什么是堆内存,什么是栈内存,它们的分配和回收有什么特点?


先介绍下栈内存:

栈内存是为线程留出的临时空间,每个线程都有一个固定大小的栈空间,而且栈空间存储的数据只能由当前线程访问,所以它是线程安全的。

栈空间的分配和回收是由系统来做的,我们不需要手动控制。

当一个函数调用时,系统就会为该函数的调用分配栈空间,当函数返回后,系统就会自动回收这块空间,同理,下次其它函数调用和返回,系统还是会自动分配和回收空间。

那它是怎么分配和回收的呢?

可以看这两个动画

还有多少人搞不懂堆内存和栈内存的区别?

 

 

还有多少人搞不懂堆内存和栈内存的区别?

 

栈空间的大小是固定的,它有一个水位线,标识栈空间的分配状态,水位线里面的表示已经分配,然后这个水位线会根据函数调用和返回的情况自动调整。

这里可以看到,栈空间的分配和回收非常简单,只需要调整水位线位置就可以了,没有任何多余操作。


那堆内存呢?

我们平时在C语言和C++中使用malloc和new分配的内存就是堆内存,堆内存的一大特点就是大小不固定,可以动态扩容,空间由程序员动态分配,更加灵活。

然而,既然有优点也必然伴随着缺点。

第一个缺点就是它容易产生内存泄露,malloc出来的没有free,new出来的如果没有delete,都会产生内存泄露,真正项目内存泄露产生的情况肯定比这个复杂的多。

第二个缺点,容易产生内存碎片,在分配和回收时需要对很多内存碎片进行整理,效率较低,具体可以看这个动画。

还有多少人搞不懂堆内存和栈内存的区别?

 

​所以才会有很多自定义的内存分配器,但它肯定还是没有栈空间分配回收速度快。

第三个缺点,线程不安全,它不像栈内存是线程独立的,堆内存可以被一个进程内所有的线程访问,多线程操作就容易产生问题,很多奇奇怪怪的操作就是这么引起的。

那什么变量存储在栈上,什么存储在堆上呢?普通的A a,这种就是都存储在栈上,当使用new和malloc分配的空间会存储在堆上,看这个图:

还有多少人搞不懂堆内存和栈内存的区别?

 

​new出来的实际空间是在堆上分配,然后在栈上开辟一个指针大小的空间,这个空间有一个指针,指向堆上的那块内存,这样给变量和堆内存之间就关联起来了。


那什么情况下使用栈内存,什么情况下使用堆内存呢?

我整理出来了一个表,贴在这里:

 

速度

空间管理

高效,不会产生碎片

会产生内存碎片

访问权限

只能局部变量

可以访问全局变量

空间大小限制

操作系统限制

没有特定的限制

内存分配

连续

随机分配

分配和释放

编译器指令自动管理

程序员手动管理

开销

主要问题

空间小

内存碎片

灵活性

固定大小

可以resize

这里可以根据实际需求来决定使用哪类内存。

当然,其实也不用关注那么多,我一般就是大内存使用堆,局部变量小内存使用栈。

这里还涉及到很多其它知识点,比如进程的内存空间布局是怎么样的,栈空间会不会污染、堆内存具体是怎么分配和回收的。

最后是提问环节,大家可以在评论区讨论一下哈。

  • 当定义一个vector<int> a(100); a在哪块内存?那100a的空间又在哪里?
  • 当定义一个array<int, 100> a; a在哪块内存,那100个a的空间又在哪里?


Tags:   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
特斯拉官宣2024春季系统更新:全新UI、自动换挡、哨兵模式预览
IT之家 4 月 17 日消息,特斯拉在 X(推特)上宣布,即将发布春季系统更新,带来了全新 UI、自动换挡、无手触碰式后备箱、哨兵模式录像预览、高速公路动能回收增强等多项界面与功能更...【详细内容】
2024-04-18  Search:   点击:(3)  评论:(0)  加入收藏
刘强东数字人直播带货:2000万观众背后的技术与情感挑战
想象一下,一个由人工智能驱动的数字人,不仅外貌和声音酷似真人,还能在直播中与观众互动、带货。这不是科幻小说的情节,而是京东直播的新现实。4月16日,以京东创始人刘强东为形象...【详细内容】
2024-04-18  Search:   点击:(2)  评论:(0)  加入收藏
刘强东带火的数字人直播:能省钱,难赚钱
4月16日下午6点18分,以京东创始人、董事局主席刘强东为形象的“采销东哥”同时亮相京东家电家居、京东超市采销直播间。根据京东超市披露,采销东哥AI数字人上播30分钟,直播间观...【详细内容】
2024-04-18  Search:   点击:(2)  评论:(0)  加入收藏
一文看懂:华为Pura 70系列四款机型有何区别
快科技4月18日消息,华为Pura 70先锋计划今天正式开启!如今P系列品牌升级为Pura系列,焕新首作Pura 70系列融合巅峰影像、美学设计与独创风格,采用独家三角形“风向标”设计,支持超...【详细内容】
2024-04-18  Search:   点击:(6)  评论:(0)  加入收藏
李彦宏新目标,押注AI原生应用
文 / 道哥“未来,自然语言将成为新的通用编程语言。你只要会说话,就可以成为一名开发者,用自己的创造力改变世界。” 4月16日,百度创始人、董事长兼首席执行官李彦宏在Create 20...【详细内容】
2024-04-18  Search:   点击:(2)  评论:(0)  加入收藏
工信部:加快6G、万兆光网研发力度
IT之家 4 月 18 日消息,工业和信息化部新闻发言人、总工程师赵志国 18 日在国新办新闻发布会上介绍,下一步,工信部将围绕高质量发展这个首要任务,进一步巩固提升信息通信业竞争...【详细内容】
2024-04-18  Search:   点击:(3)  评论:(0)  加入收藏
万达电影正式易主实控人变更为儒意柯利明 王健林套现44亿
搜狐娱乐讯 (哈麦/文)4月16日晚,万达电影公告,北京万达文化产业集团、王健林,分别转让所持北京万达投资20%股权、1.2%股权,已办理完成工商变更登记手续。本次股权转让完成后,儒意投...【详细内容】
2024-04-18  Search:   点击:(2)  评论:(0)  加入收藏
提高Windows操作系统效率与速度的实用技巧指南
在这个快节奏的数字时代,我们都希望能够高效地完成工作和日常任务。对于广泛使用的Windows操作系统,掌握一些操作技巧不仅可以提高我们的工作效率,还能让我们的电脑运行得更加...【详细内容】
2024-04-18  Search:   点击:(3)  评论:(0)  加入收藏
华为Pura70系列约一分钟售罄!Pura 70 Ultra售9999起,鸿蒙生态打响原生之战
千呼万唤,华为Pura 70终于来了。据华为终端微博:2012年4月18日,华为首款P系列手机上市,今天,华为推出了“HUAWEI Pura 70系列 先锋计划”,Pura 70 Ultra和Pura 70 Pro于10:08先锋...【详细内容】
2024-04-18  Search:   点击:(3)  评论:(0)  加入收藏
电瓶车高端化,暂时无解
文 | 斑马消费,作者 | 范建2024年,新能源汽车市场的价格战,一轮比一轮汹涌。微缩版新能源&mdash;&mdash;两轮电动车市场,也正在上演类似故事。去年,两轮电动车市场双雄,雅迪控股销...【详细内容】
2024-04-18  Search:   点击:(2)  评论:(0)  加入收藏
▌简易百科推荐
Meta如何将缓存一致性提高到99.99999999%
介绍缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩...【详细内容】
2024-04-15    dbaplus社群  Tags:Meta   点击:(2)  评论:(0)  加入收藏
SELECT COUNT(*) 会造成全表扫描?回去等通知吧
前言SELECT COUNT(*)会不会导致全表扫描引起慢查询呢?SELECT COUNT(*) FROM SomeTable网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小...【详细内容】
2024-04-11  dbaplus社群    Tags:SELECT   点击:(3)  评论:(0)  加入收藏
10年架构师感悟:从问题出发,而非技术
这些感悟并非来自于具体的技术实现,而是关于我在架构设计和实施过程中所体会到的一些软性经验和领悟。我希望通过这些分享,能够激发大家对于架构设计和技术实践的思考,帮助大家...【详细内容】
2024-04-11  dbaplus社群    Tags:架构师   点击:(2)  评论:(0)  加入收藏
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(5)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(9)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(16)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(14)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(9)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(14)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(10)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条