面试总结-堆栈详解

1.数据结构中的堆和栈

栈是一种先进后出的数据结构,是一种线性结构;堆是一种非线性结构,是有序的一般为大根堆或小根堆,堆的存取比较随意;

2.内存分配中的堆和栈

一般情况下程序是放在ROM或者Flash中的,运行时需要拷贝到内存中才可以执行,内存会分别存储不同的信息。接下来就详细介绍一下内存分配中堆和栈的区别。

(1)申请和回收方式:栈使是系统直接分配和回收的;堆是根据用户的需要自己申请的和释放的,因此可能忘记释放而会造成内存泄漏。由此可见一般的栈的生存周期小于堆的生存周期。

(2)申请时系统的响应:当运行时需要栈空间时,系统会自动判断需要的栈空间大小,如果需要的空间小于当前栈所剩余的空间,则直接分配,否则提示栈的空间不足,程序直接crash;堆是由程序控制申请的,当申请堆时,系统首先会查找记录空闲内存地址的表,当找到第一个大于等于申请空间的内存地址,就将该地址返回,并在首地址记录此次分配的大小,方便后续的释放。在找到的内存大于要申请的内存时,系统将需要的内存返回给用户,将多余的内存再次放回空闲内存表中。

(3)申请效率:栈是由系统控制的,操作速度较快,但程序员不可控;堆是可以有程序员控制的,申请时速度较栈的速度慢,但使用较为灵活,但是已造成内存的碎片化。

(4)大小限制:栈在windows是向低地址扩展的数据结构,是一块连续的内存区域,因此大小有限,一般为2M;堆在内存中是不连续的,地址扩展方向是向高地址增长的,使用空闲内存链表存储,大小受计算机的虚拟内存限制,因此堆的可用大小远远大于栈的大小

(5)存储内容的区别:栈中一般存储函数调用的相关信息(入口地址,参数和返回值);堆中除了头部用于存储堆的大小外,其余内容均有程序员决定。

(6)存取效率:栈上的数组存取速度比指针存取的速度快。

以上仅为自己知道的一些点,欢迎大家补充,如果有不正确的地方也请指出

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值