堆和栈的区别

        最近在刷题时看到了这道考察内存管理的题,觉得有必要整理一下。在这里我主要就这道题题进行总结,具体的内存知识可以看这篇文章---《内存空间布局》。

        先简单整理一下什么是堆?什么是栈?然后再来总结二者区别!

堆和栈的区别

(1)数据结构特点:栈是一种线性数据结构,具有后进先出(LIFO)的特性,即最后放入的数据项最先被取出。

(2)内存结构:在计算机内存中,栈通常是由一段连续的内存空间构成的,称为栈帧 。每当一个函数被调用时,系统会在栈上创建一个新的栈帧,用于存储该函数的局部变量、参数、返回地址等信息。函数执行完毕后,对应的栈帧会被销毁,栈顶指针回退,恢复到上一个函数的栈帧,继续执行之前的上下文。

(3)函数调用过程:当一个函数被调用时,系统会将该函数的局部变量、参数值等数据压入栈中,同时保存当前函数的执行状态(如返回地址)。函数执行完毕后,系统会从栈顶弹出对应的数据,恢复上一个函数的执行状态,继续执行之前的上下文。

(4)局部变量和函数参数:在函数内部定义的局部变量和函数参数通常存储在栈中,它们的生命周期和函数的执行周期相关联。当函数调用结束时,栈会自动释放存储在栈上的局部变量和函数参数,回收对应的内存空间。

(1)动态分配:堆区的内存分配是动态的,可以在程序运行时根据需要分配任意大小的内存空间。堆区的分配和释放是由程序员手动管理的,我们通常使用malloc、free、new、delete

(2)内存结构:堆区通常由操作系统管理的一段较大的内存空间组成,称为堆(Heap)。在堆上分配的内存空间通常由链表或树等数据结构进行管理,以记录已分配和未分配的内存块。

(3)生命周期:堆上分配的内存空间的生命周期不受限于函数的作用域,可以在不同的函数之间共享和传递。堆上分配的内存空间直到程序员显式释放或程序结束时才会被释放,需要注意避免内存泄漏的情况。

堆和栈的区别

(1)分配方式

        栈是系统自动分配的内存区域,用于存储函数调用的上下文信息、局部变量和函数参数等。

        堆是程序员手动申请的内存区域,堆中的存放内容是由程序员填充的。

(2)访问速度

        栈上的内存访问速度较快,因为栈上的数据按照固定的顺序存储,不需要进行动态分配和释放。

        堆上的内存访问速度相对较慢,因为堆上的内存是动态分配的。

(3)增长方向

        栈的内存地址从高地址向低地址增长。

        堆的内存地址从低地址向高地址增长。

(4)内存空间

        栈是一个静态的数据结构,其大小在程序编译时就已经确定,并且大小是固定的。

        堆是一个动态的数据结构,其分配的内存空间在程序运行期间可以动态增加或减少。

(5)访问顺序     

        栈是一种先进后出的数据结构。在栈中,最后一个进入的元素首先被访问和处理,而最先进入的元素最后被访问和处理。

        堆不是按照特定顺序存储和访问数据,没有固定的顺序。

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学代码的小信

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值