堆栈与栈的区别

操作系统中的堆和栈

都指的是内存空间。

1.内存分配方式

栈:

  • 自动分配和释放:由编译器自动管理,函数调用时分配局部变量和参数,函数结束时自动释放。
  • 线性结构:内存按后进先出的顺序操作,仅通过移动栈顶指针完成分配和释放。

堆:

  • 手动管理:通过代码去申请和释放,在c语言中使用malloc去申请内存,使用free去释放。在C#中使用New去申请内存,通过垃圾回收器去释放内存
  • 动态分配:内存块按需分配,需要维护复杂结构(如空闲链表)来管理碎片。

2.栈与堆中数据的生命周期

栈:

  • 短暂:变量生命周期与函数调用绑定,函数结束集销毁。
  • 确定性:无需担心内心泄露。

堆:

  • 持久:内存生命周期有程序员控制, 可以跨函数或线程存在。
  • 风险:过早释放可能引发野指针,忘记释放会导致内存泄漏。

3.大小区别

栈:

  • 固定且较小:通常默认几MB(Linux默认8MB)递归过深(或无法结束)或大局部变量易导致溢出 Stack Overflow。

堆:

  • 灵活且较大:收物理内存和系统现在,可分配空间远大于栈。

4.访问速度

栈:

  • 高效:连续内存空间,仅需要移动指针,没有碎片问题,CPU缓存命中率高。

堆:

  • 较慢:需要动态去查找可用内存块,在频繁分配和释放不同大小的内存块会导致碎片可能触发碎片整理或系统调用 (如brk,sbrk)

5.线程与安全

栈:

  • 线程私有:没有线程拥有独立的栈,数据无需同步机制,天然线程安全。

堆:

  • 线程共有:所有线程共享,需同步机制(如锁)避免竞态条件。

6.典型用途

栈:

  • 因为栈高效但有限,适合小数据,短生命周期 如函数调用,局部变量

堆:

  • 灵活但管理复杂,适合大数据或长生命周期。如动态数据结构链表,树,

CPU命中率:是衡量CPU缓存效率的重要核心指标,表示CPU在缓存中找到所需数据的概率。

全部评论

相关推荐

老粉都知道小猪猪我很久没更新了,因为秋招非常非常不顺利,emo了三个月了,接下来说一下我的情况吧本人是双非本 专业是完全不着计算机边的非科班,比较有优势的是有两段大厂实习,美团和字节。秋招面了50+场泡池子泡死的:滴滴 快手 去哪儿 小鹏汽车 不知名的一两个小厂其中字节13场 两次3面挂 两次2面挂 一次一面挂其中有2场面试题没写出来,其他的都是全a,但该挂还是挂,第三次三面才面进去字节,秋招加暑期总共面了22次字节,在字节的面评可以出成书了快手面了8场,2次实习的,通过了但没去,一次2面挂 最后一次到录用评估 至今无消息滴滴三面完 没几天挂了 所有技术面找不出2个问题是我回答不上来的,三面还来说我去过字节,应该不会考虑滴滴吧,直接给我干傻了去哪儿一天速通 至今无消息小鹏汽车hr 至今无消息美团2面挂 然后不捞我了,三个志愿全部结束,估计被卡学历了虾皮二面挂 这个是我菜,面试官太牛逼了拼多多二面挂 3道题也全写了 也没问题是回答不出来的 泡一周后挂腾讯面了5次 一次2面挂 三次一面挂,我宣布腾讯是世界上最难进的互联网公司然后还有一些零零散散的中小厂,但是数量比较少,约面大多数都是大厂。整体的战况非常惨烈,面试机会少,就算面过了也需要和各路神仙横向对比,很多次我都是那个被比下去的人,不过这也正常,毕竟谁会放着一个985的硕士不招,反而去招一个双非读化学的小子感觉现在互联网对学历的要求越来越高了,不仅仅要985还要硕士了,双非几乎没啥生存空间了,我感觉未来几年双非想要进大厂开发的难度应该直线上升了,唯一的打法还是从大二刷实习,然后苟个转正,不然要是去秋招大概率是炮灰。而且就我面字节这么多次,已经开始问很多ai的东西了,你一破本科生要是没实习没科研懂什么ai啊,纯纯白给了
不知名牛友_:爸爸
秋招你被哪家公司挂了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务