0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

汽车电子技术 来源: 大橙子疯嵌入式 作者:大橙子疯 2023-02-15 15:08 次阅读

前言

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

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

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

内存分配图

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

图片


增长方向及原因

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

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

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

能够确定栈的起始地址。

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

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

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

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

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

    关注

    8

    文章

    2767

    浏览量

    72803
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39909
  • STACK
    +关注

    关注

    0

    文章

    11

    浏览量

    2710
收藏 人收藏

    评论

    相关推荐

    STM32 大小端模式 与 堆栈及其增长方向分析

    各个全局变量和静态变量.的生长方向,都是向上的.在程序里面,所有的内存分为:+. 只是他们各自的起始地址和增长方向不同,他们没有一个固
    发表于 02-10 10:28

    0.5MM间距的fpc软排线的线宽和线距通常是多少啊?求解

    如题,0.5MM间距的fpc软排线的线宽和线距通常是多少啊?求行业内大神告知~在此谢谢了~
    发表于 09-18 15:10

    STM32堆栈增长方向问题

    STM32的堆栈增长方向是从高地址往低地址增长的,这样的话底应该是高地址咯。而下图的底却是低地址,查了很多资料,感觉都很矛盾。像INT8UOSTaskCreateExt 的第三个参
    发表于 04-20 04:36

    UCOSIII任务堆栈和STM32堆栈增长方向是否一致?

    的原子哥视频,发现视频里这块儿没讲,UCOS里的堆栈方向是向上增长,而32里是向下[摘自原子哥],这样会不会冲突呢?我所尝试的理解:这两个堆栈占用的是互不相关的两个存储空间////@发烧友 @mygod @Admin @伟好好学习
    发表于 04-23 03:51

    【原创】C语言中的动态内存-----内存

    区域内部的指针,也就是它的值是一个地址,这个地址位于区的下界和区的上界之间。指针把这个区域分为两个部分,一个是已经使用的区域,一个
    发表于 07-07 14:18

    MCU空间和空间的相关资料分享

    stack 空间 heap 空间存储函数参数和局部变量,所需空间由系统自动分配,回收也由系统管理,无需人工干预存储动态分配的内存块,分配和释放空间均由程序员控制,有可能产生内存泄漏严格后进先出
    发表于 11-03 08:54

    的区别是什么

    在回答完进程的虚拟地址空间布局之后(上一篇),面试官可能抓住深入展开。的区别①管理方式:由编译器自动管理;
    发表于 12-22 07:26

    什么是?什么是

    ,程序执行过程中溢出,极大可能的影响程序、系统的稳定,严重时会造成程序、系统的崩溃,所以堆栈溢出检测十分重要且必要。什么是,什么是
    发表于 12-22 06:09

    GPIO内部结构通常是什么样

    ”经常弄不清什么是开漏什么是推挽、IO输入输出电路原理。本文的目地是让大家清楚GPIO的几种配置,GPIO内部结构通常是什么样,上拉、下拉电阻的作用,拉电流、灌电流是什么有助于遇到问题时进行硬件分析,而
    发表于 01-25 06:25

    放大电路的静态工作点通常是指?

    放大电路的静态工作点通常是指?
    发表于 01-27 13:37

    四轴的姿态进行采样用通常是用什么滤波算法进行滤波的?

    四轴的姿态进行采样用通常是用什么滤波算法进行滤波的
    发表于 10-09 06:42

    连接器通常是EMI问题

    在减少EMI问题时,大多数同轴电缆表现相同。它们都是普通电流的良好天线,可以辐射并通过FCC认证类型测试。电缆不是EMC测试失败的主要来源,通常是连接器。 如果有任何净电流或常见电流一根电缆,通过
    的头像 发表于 11-10 14:58 175次阅读

    光在一个方向上传播的轨迹与在相反方向上传播的轨迹相同吗

    光的传播通常是互换的,这意味着光在一个方向上传播的轨迹,与在相反方向上传播光的轨迹相同。
    的头像 发表于 03-27 16:52 1955次阅读

    用C语言如何判断栈的增长方向

    毕竟堆栈也就是内存,自然就可以通过堆栈的分配过程取出所分配的内存地址来比较判断,而C语言可以方便的访问内存,也就比较容易判断当前处理器中堆栈指针的增长方向了。
    的头像 发表于 07-28 11:23 2007次阅读
    用C语言如何判断栈的<b class='flag-5'>增长方向</b>呢

    传统封装通常是指什么?包括哪些封装形式?

    传统封装通常是指先将晶片切割成单个芯片再进行封装的工艺形式,主要包含SIP、DIP、SOP、SOT、TO、QFP、QFN、DFN、BGA 等封装形式。
    的头像 发表于 02-15 17:37 3817次阅读