操作系统中的堆栈区别

操作系统中的堆栈区别堆和栈是两种内存分配的统称 一 栈栈会存放函数的局部变量 函数的返回地址等 栈有 LIFO 后进先出 的特点 栈由操作系统分配 自动回收 栈的大小受到限制 在 x86 体系下 栈一般通过 esp 指向栈帧顶部 ebp 指向底部不断的嵌套或者为局部变量分配空间 可能导致栈溢出 这时候会触发一个异常在执行完一个函数的时候 其中的变量都会从堆栈中弹出 无需亲自管理内存 变量会自动分配和释放

堆和栈是两种内存分配的统称。

一.栈

  • 栈会存放函数的局部变量,函数的返回地址等。栈有”LIFO”(后进先出)的特点。
  • 栈由操作系统分配,自动回收.
  • 栈的大小受到限制。在x86体系下,栈一般通过esp 指向栈帧顶部,ebp指向底部
  • 不断的嵌套或者为局部变量分配空间,可能导致栈溢出。这时候会触发一个异常
  • 在执行完一个函数的时候,其中的变量都会从堆栈中弹出。
  • 无需亲自管理内存,变量会自动分配和释放。
  • 栈一般是高地址向低地址扩展,函数返回的时候,会通过返回原来的位置来释放空间。
  • 栈对应的是CPU的一级缓存,一级缓存在CPU内部,访问快,比较小

二.堆

  • 堆是计算机中不会自动管理的区域,不受CPU严格管理,它是内存中更加自由浮动的区域。
  • 我们可以通过封装好的函数(malloc/calloc/new…)来进行内存分配
  • 内核维护了一个brk指针,指向堆的顶部,将堆视为大小不同的块的集合来进行维护,每一个块就是一个连续的虚拟内存,要么是已经分配的,要么是空闲的,已经分配的块显式的保留为供应用程序使用,空闲块可以分配内存。
  • 堆是从低地址向高地址扩展,是不连续的内存区域。系统通过链表来存储空闲内存地址。
  • 一般在堆的头部用一个字节存放堆的大小。
  • 堆一般是CPU二级缓存,CPU和内存之间的地址,访问比一级缓存慢,但是比读内存快,容量比较大
  • 在多线程的情况下,线程有自己的栈,彼此共享创建他们的进程的堆。
  • 堆分配的内存必须进行手动释放

三.区别

管理方式:

  • 对于栈来讲,是由编译器自动管理。
  • 对于堆来说,分配释放工作由程序员控制,容易造成内存泄露。

空间大小:

  • 一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的。

碎片问题:

  • 对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,操作系统会自动回收.

生长方向:

  • 对于堆来讲,向着内存地址增加的方向增长(低地址向高地址);
  • 对于栈来讲,向着内存地址减小的方向增长(高地址向低地址)。

分配方式:

  • 堆都是动态分配(运行期)的,没有静态分配(编译期)的堆。
  • 栈有2种分配方式:静态分配和动态分配(alloca()函数可以动态分配栈的内存空间,释放的时候由编译器自己释放)。

分配效率:

  • 计算机在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
  • 堆则是C/C++函数库提供的,效率比栈要低得多。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218919.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:10
下一篇 2026年3月17日 下午11:10


相关推荐

  • 仿QQ联系人的TableView的折叠与拉伸

    仿QQ联系人的TableView的折叠与拉伸

    2022年3月12日
    70
  • 【MySQL】explain 用法详解

    【MySQL】explain 用法详解MySQL explain 用法详解 explain 命令主要来查看 SQL 语句的执行计划 查看该 SQL 语句有没有使用索引 有没有做全表扫描等 它可以模拟优化器执行 SQL 查询语句 从而知道 MySQL 是如何处理用户的 SQL 语句 文章目录 MySQL explain 用法详解一 explain 能干什么二 如何使用 explain 三 explain 各字段的含义 3 1id3 2select type3 3table3 4type3 5possible keys3 6key3 7key len3 8

    2026年3月18日
    2
  • opencv图像角点提取

    opencv图像角点提取opencv角点检测(二)改进的Harris角点检测算法harris角点检测算法的结果一定程度上取决于系数k,有人对Harris的角点检测算法进行了改进,直接利用像素点协方差矩阵的特征值提取角点。而且不在进行非极大值抑制,而是采用一种容忍距离的形式,在角点的一定范围内只有一个角点。具体原理:首先计算图像每个像素点的协方差矩阵,并求取对应的特征值,将最小的特征值最大的那个像素点作为第

    2022年8月30日
    5
  • 二进制中的加减法_二进制数的加减运算

    二进制中的加减法_二进制数的加减运算二进制的加减法1)二进制加法(1)BinaryAddition)Sincebinarynumbersconsistofonlytwodigits0and1,sotheiradditionisdifferentfromdecimaladdition.Additionofbinarynumberscanbedonefollowingcer…

    2026年3月9日
    4
  • 太极阴,阳虚拟框架—-各种插件大总结(烂尾)[通俗易懂]

    太极阴,阳虚拟框架—-各种插件大总结(烂尾)[通俗易懂]最近心血来潮又想起了折腾自己的安卓手机,不由得就想起来了几年前的Xposed框架.于是又开始跃跃欲试起来然而在网上冲浪许久后,虽然人们七嘴八舌但我大概还是看出来了Xposed对于高版本android好像已经不太能用了,更何况我用的还是MIUI于是,我发现了一个新的玩意—-太极框架.(咳,应该也不是啥新东西了只不过我才关注到而已)当然,现在还有好多类似的东西,但这不是我们的主题….

    2022年6月4日
    167
  • JSONObject与JSONArray的使用

    JSONObject与JSONArray的使用

    2021年11月15日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号