堆和栈的增长方向为什么通常是相反的?

描述

前言

数据结构中,堆(heap)与栈(stack)是两个常见的数据结构,它们的存在都是为了优化内存,提高使用效率,各有特点,理解二者的定义、用法与区别,能够利用堆与栈解决很多实际问题。

栈:由操作系统(编译器)自动分配释放 ,存放函数的参数值,局部变量的值等

堆:一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收

内存分配图

通过下图了解常用的堆栈内存分配和增长方向:

STACK


增长方向及原因

堆(heap)的增长方向是向上增长,即低地址向高地址增长。

栈(stack)的增长方向是向下增长,即高地址向低地址增长。

堆和栈的增长方向不一致可以让空闲的内存能最大程度的被使用。

能够确定栈的起始地址。

从内存分配图来看,假设栈(stack)的增长方向也是向上增长,那么栈空间的起始位置就要事先固定下来,在栈和堆的总内存大小确定的时候,一个分配多了。另一个分配少了,在不同程序中内存的使用情况不同,有些栈用的多,有些堆用的多。

所以就很有可能出现这种情况:一个程序因为栈溢出而崩溃的时候,其实它还有大量闲置的堆空间没有被使用,但是我们却无法使用这些闲置的堆空间。所以最好的办法就是让堆和栈一个向上涨,一个向下涨,这样它们就可以最大程度地共用这块剩余的地址空间,达到利用率的最大化!

并且在栈和堆的总内存大小已经确定的情况下,不用考虑程序中堆栈的不同使用情况下就能先确定栈的起始地址。

当然,现在的有些芯片在编译时可以指定栈的增长方向,不过常用的还是向下增长。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分