为什么编程语言中需要堆和栈

概述

在我们学习 C/C++ 和 Java 等编程语言的时候经常要学习一个概念就是堆和栈,对于大部分经验丰富的工程师来说,堆和栈是再熟悉不过的东西了,堆和栈都是存储程序运行时变量的地方。但这个时候问题来了,既然两个都是存储临时变量的地方,那么为什么那么多编程语言既需要栈也需要堆呢。

栈和堆结构的特性

栈一般来说都是一个 “后进先出” 队列,后进入的数据,会先被释放掉。而堆一般是个链表或者树结构,不同语言有不同实现,相对而言复杂的多。

为什么既需要栈又需要堆

在数学中,我们经常使用反证法来证明问题,在这里我们也可以按照反证的思路去思考这个问题。

仅使用栈

假设我们的程序代码仅仅使用栈,那么我们的代码会变得非常的简单,程序在执行函数的时候,只需要依次的将变量压入堆栈就好了,当要释放的时候取出来就好了,针对实现的时候,只需要让指针上下移动就好。这么一看栈似乎很完美,它性能优越快速,而且不会产生内存碎片。但是假设我们现在有这么一个操作现在有两个变量 A,B 我们先依次把他们入栈,入栈后的后续操作我们主要是围绕 B 进行的,与 A 已经没有关系了,但是 A 依旧占用着空间,如果我们希望释放 A 的内存空间,那么根据后进先出的原则,那么我们必须先释放 B 才能释放 A,但是后续的计算又需要 B 这就导致我们无法释放 A,在后续的过程中 A 已经没有价值了,但是它还是必须驻留在内存中。而这个时候如果将 A 放入堆中,那么当 A 不在使用的时候,我们可以很容易的在堆中释放 A 所占用的空间,提高内存的有效使用率。这就是堆出现的初衷。

仅使用堆

堆之所以能与比栈更好的动态分配的性能是因为堆往往使用了较为复杂的数据结构,这就会导致操作堆的成本要远远大于栈的成本,所以如果仅仅使用堆会使的程序整体效率变慢。

总结

类似计算机科学中的很多场景,我们在选择技术方案的时候往往根据不同的场景选择更为合适的策略,而不是选择单一策略。在编程语言中由于堆和栈不同的特性,他们被分别设计用于做动态内存分配和静态快速内存分配,在这样的划分中一起提高了整体系统的效率。

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值