[其它应用] 为什么堆和栈的增长方向相反?

[复制链接]
2142|8
 楼主| 豌豆爹 发表于 2023-11-3 11:19 | 显示全部楼层 |阅读模式
在数据结构中,堆(heap)与栈(stack)是两个常见的数据结构,它们的存在都是为了优化内存,提高使用效率,各有特点。理解二者的定义、用法与区别,能够利用堆与栈解决很多实际问题。
栈:由操作系统(编译器)自动分配释放 ,存放函数的参数值,局部变量的值等。
堆:一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收。
1、内存分配图
通过下图了解常用的堆栈内存分配和增长方向:
2、增长方向及原因
堆(heap)的增长方向是向上增长,即低地址向高地址增长。
栈(stack)的增长方向是向下增长,即高地址向低地址增长。
堆和栈的增长方向不一致可以让空闲的内存能最大程度的被使用。
能够确定栈的起始地址。
从内存分配图来看,假设栈(stack)的增长方向也是向上增长,那么栈空间的起始位置就要事先固定下来,在栈和堆的总内存大小确定的时候,一个分配多了。另一个分配少了,在不同程序中内存的使用情况不同,有些栈用的多,有些堆用的多。
所以就很有可能出现这种情况:一个程序因为栈溢出而崩溃的时候,其实它还有大量闲置的堆空间没有被使用,但是我们却无法使用这些闲置的堆空间。所以最好的办法就是让堆和栈一个向上涨,一个向下涨,这样它们就可以最大程度地共用这块剩余的地址空间,达到利用率的最大化!
并且在栈和堆的总内存大小已经确定的情况下,不用考虑程序中堆栈的不同使用情况下就能先确定栈的起始地址。
当然,现在的有些芯片在编译时可以指定栈的增长方向,不过常用的还是向下增长。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
AdaMaYun 发表于 2023-11-6 21:17 | 显示全部楼层
这个是相对的吧
tpgf 发表于 2023-12-2 15:27 | 显示全部楼层
这个是和他们使用的目的相匹配的
gwsan 发表于 2023-12-2 16:26 | 显示全部楼层
归根结底还是他们使用的方式不同
zljiu 发表于 2023-12-3 08:41 | 显示全部楼层
也就是说他们两个的使用主体是不一样的是吗
tfqi 发表于 2023-12-3 09:27 | 显示全部楼层
这样使用的话是不是可以方便的进行动态分配呢
nawu 发表于 2023-12-3 10:00 | 显示全部楼层
他们的用途不同 使用方法也不相同
aoyi 发表于 2023-12-3 10:41 | 显示全部楼层
确实是这样 我学习的时候就没有深入想过这个问题呢
绒兔星球 发表于 2025-8-30 14:49 | 显示全部楼层
堆和栈增长方向相反是操作系统内存管理的设计结果。栈用于函数调用、局部变量存储,需快速分配 / 释放,从高地址向低地址增长,栈指针下移即可扩展;堆用于动态内存分配,大小不固定,从低地址向高地址增长,便于灵活管理大块内存。这种反向设计可高效利用内存空间,避免两者分配时冲突。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

534

主题

2316

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部