【C++】内存栈和堆的区别

内存栈和堆的区别:

  1. 管理方式:栈由编译器自动管理;堆由程序员控制,使用方便,但易产生内存泄漏
  2. 扩展方向:栈向低地址扩展,是连续的内存区域;堆是向高地址扩展,是不连续的内存区域。(原因:系统是用链表来存储空闲内存地址,是不连续的,而链表从低地址向高地址遍历)
  3. 空间大小:栈顶地址和栈的最大容量由系统预先规定(通常默认2M或10M);堆的大小受限于计算机系统中有效的虚拟内存,32位Linux系统中堆内存可达2.9G空间。
  4. 存储内容:栈在函数调用时,首先压入主调函数中下条指令(函数调用语句的下一条可执行语句)的地址,然后是函数实参,然后是被调函数的局部变量。本次调用结束后,局部变量先出栈,然后是参数,最后是栈顶指针指向最开始存的指令地址,程序由该点继续运行下一条可执行语句。堆通常在头部使用一个字节存放其大小,堆用于存储生存期与函数调用无关的数据,具体内容由程序员安排。
  5. 分配方式:栈可静态分配或动态分配。静态分配由编译器完成,如局部变量的分配。动态分配由alloca函数在栈上申请空间,用完后自动释放;堆只能动态分配且手动释放。
  6. 分配效率:栈由计算机底层提供支持:分配专门的寄存器存放栈地址,压栈出栈由专门的指令执行,因此效率较高。堆由函数库提供,机制复杂,效率比栈低得多。
  7. 分配后系统响应:只要栈剩余空间大于申请空间,系统将为程序提供内存,否则报告异常提示栈溢出。操作系统为堆的维护提供了一个记录空闲内存地址的链表。当系统收到程序的内存分配申请时,会遍历该链表寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点空间分配给程序。若无足够大小的空间,有可能调用系统功能去增加程序数据段的内存空间,以便有机会分到足够大小得内存,然后进行返回。大多数系统会在该内存空间首地址记录本次分配得内存大小,供后续的释放函数正确释放本内存空间。(由于找到的堆结点大小不一定正好等于申请的大小,系统会自动将多余的部分重新放回空闲链表中)
  8. 碎片问题:栈不会产生碎片问题。而频繁申请和释放操作会造成堆内存空间不连续,从而造成大量碎片。

【注意】使用栈和堆时应避免越界发生,否则可能程序崩溃或破坏程序堆、栈结构,产生意想不到的结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值