栈和堆的区别

栈和堆的区别一 程序的内存分配方式不同栈区 stack 编译器自动分配释放 存放函数的参数值 局部变量的值等 其操作方式类似于数据结构的栈 堆区 heap 一般是由程序员分配释放 若程序员不释放的话 程序结束时可能由 OS 回收 值得注意的是他与数据结构的堆是两回事 分配方式倒是类似于数据结构的链表 二 申请方式不同 stack 由系统自动分配 heap 需要程序员自己申请 C 中用函数 ma

一、程序的内存分配方式不同

  • 栈区(stack):编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。
  • 堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。

二、申请方式不同

  • stack 由系统自动分配,heap 需要程序员自己申请。
  • C 中用函数 malloc分配空间,用 free 释放,C++用 new 分配,用 delete 释放。

三、申请后系统的响应不同

  • 栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出。
  • 堆:首先应该知道操作系统有一个记录内存地址的链表,当系统收到程序的申请时,遍历该链表,寻找第一个空间大于所申请的空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的 delete 或 free 语句就能够正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会将多余的那部分重新放入空闲链表中。

四、 申请的大小限制不同

  • 栈:在 windows 下,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小。
  • 堆:堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是由链表在存储空闲内存地址,自然堆就是不连续的内存区域,且链表的遍历也是从低地址向高地址遍历的,堆得大小受限于计算机系统的有效虚拟内存空间,由此空间,堆获得的空间比较灵活,也比较大。

五、申请的效率不同

  • 栈:栈由系统自动分配,速度快,但是程序员无法控制
  • 堆:堆是有程序员自己分配,速度较慢,容易产生碎片,不过用起来方便

六、堆和栈的存储内容不同

  • 栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后函数的各个参数,在大多数的 C 编译器中,参数是从右往左入栈的,当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令。
  • 堆:一般是在堆的头部用一个字节存放堆的大小,具体内容由程序员安排。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2026年3月19日 下午12:42
下一篇 2026年3月19日 下午12:43


相关推荐

  • [数字dp] hdu 3565 Bi-peak Number

    [数字dp] hdu 3565 Bi-peak Number

    2022年1月6日
    54
  • 用Python写了个工具,完美破解了MySQL!!(建议收藏)

    用Python写了个工具,完美破解了MySQL!!(建议收藏)再也不怕忘记MySQL的用户名和密码了,用这个工具可以秒破MySQL,冰河强烈建议收藏!!

    2022年5月31日
    40
  • but六种用法_比较级的用法和句型

    but六种用法_比较级的用法和句型1.EXPLAIN简介使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。➤通过EXPLAIN,我们可以分析出以下结果:表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实际使用表之间的引用每张表有多少行被优化器查询➤使用方式如下:EXPLAIN+SQL语…

    2022年10月18日
    4
  • win10此计算机缺少或多,win10系统打开cad提示缺少一个或多个shx文件的设置方案…

    win10此计算机缺少或多,win10系统打开cad提示缺少一个或多个shx文件的设置方案…win10 系统使用久了 好多网友反馈说 win10 系统打开 cad 提示缺少一个或多个 shx 文件的问题 非常不方便 有什么办法可以永久解决 win10 系统打开 cad 提示缺少一个或多个 shx 文件的问题 面对 win10 系统打开 cad 提示缺少一个或多个 shx 文件的图文步骤非常简单 只需要 1 首先我们在弹出的提示框中点击 为每个 sHx 文件制定替换文件 2 之我们可以看到缺少的 sHx 文件 比如小编的电脑中缺少

    2026年3月20日
    1
  • php清空mysql数据表,mysql怎么清空数据表数据[通俗易懂]

    php清空mysql数据表,mysql怎么清空数据表数据[通俗易懂]在mysql中,可以利用“DELETE”和“TRUNCATE”关键字来清空数据表中的数据,具体语法为“DELETEFROM数据表;”和“TRUNCATETABLE数据表;”。本教程操作环境:windows7系统、mysql8版、DellG3电脑。MySQL提供了DELETE和TRUNCATE关键字来删除表中的数据。MySQLDELETE关键字在MySQL中,可以使用D…

    2022年5月9日
    48
  • tcp/ip网络通讯安全加密方法[通俗易懂]

    tcp/ip网络通讯安全加密方法[通俗易懂]tcp/ip网络通讯安全是一个广受关注的话题,现在也有一些基于tcp/ip加密技术标准如SSL,TLS等。但很多时候编写一些简单的网络通讯把这标准加密应用添加进来乎一下子把程序变得复杂了,而实现自己的加密算法那就更加不可取;其实通过一些现有的加密的技术应用完全可以实现即简单又安全的网络通讯程序。首先保证网络通讯安全有两个方面,第一保证连接的有效性,其二就…

    2022年5月20日
    394

发表回复

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

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