为什么编程语言中需要堆和栈
2018-03-07 00:08
274 查看
概述
在我们学习 C/C++ 和 Java 等编程语言的时候经常要学习一个概念就是堆和栈,对于大部分经验丰富的工程师来说,堆和栈是再熟悉不过的东西了,堆和栈都是存储程序运行时变量的地方。但这个时候问题来了,既然两个都是存储临时变量的地方,那么为什么那么多编程语言既需要栈也需要堆呢。栈和堆结构的特性
栈一般来说都是一个 “后进先出” 队列,后进入的数据,会先被释放掉。而堆一般是个链表或者树结构,不同语言有不同实现,相对而言复杂的多。为什么既需要栈又需要堆
在数学中,我们经常使用反证法来证明问题,在这里我们也可以按照反证的思路去思考这个问题。仅使用栈
假设我们的程序代码仅仅使用栈,那么我们的代码会变得非常的简单,程序在执行函数的时候,只需要依次的将变量压入堆栈就好了,当要释放的时候取出来就好了,针对实现的时候,只需要让指针上下移动就好。这么一看栈似乎很完美,它性能优越快速,而且不会产生内存碎片。但是假设我们现在有这么一个操作现在有两个变量 A,B 我们先依次把他们入栈,入栈后的后续操作我们主要是围绕 B 进行的,与 A 已经没有关系了,但是 A 依旧占用着空间,如果我们希望释放 A 的内存空间,那么根据后进先出的原则,那么我们必须先释放 B 才能释放 A,但是后续的计算又需要 B 这就导致我们无法释放 A,在后续的过程中 A 已经没有价值了,但是它还是必须驻留在内存中。而这个时候如果将 A 放入堆中,那么当 A 不在使用的时候,我们可以很容易的在堆中释放 A 所占用的空间,提高内存的有效使用率。这就是堆出现的初衷。仅使用堆
堆之所以能与比栈更好的动态分配的性能是因为堆往往使用了较为复杂的数据结构,这就会导致操作堆的成本要远远大于栈的成本,所以如果仅仅使用堆会使的程序整体效率变慢。总结
类似计算机科学中的很多场景,我们在选择技术方案的时候往往根据不同的场景选择更为合适的策略,而不是选择单一策略。在编程语言中由于堆和栈不同的特性,他们被分别设计用于做动态内存分配和静态快速内存分配,在这样的划分中一起提高了整体系统的效率。相关文章推荐
- 为什么需要更多的编程语言
- 除了 Python,为什么机器学习还需要一种新的编程语言?
- (java面试)为什么需要重写equals方法
- TCP/IP协议(1)为什么需要tcp/ip协议(亚当需要寻找夏娃)?
- 为什么需要htons(), ntohl(), ntohs(),htons() 函数
- 为什么需要线程?
- 为什么TCP连接需要三次握手分开需要四次握手?
- BSS段为什么需要初始化
- 为什么需要在TypedArray后调用recycle
- 为什么会需要消息队列(MQ)?
- 为什么 Java 8 中不再需要 StringBuilder 拼接字符串
- 面向过程和面向对象思维方式的区别?为什么需要面向对象编程?
- SQL Server 优化---为什么索引视图(物化视图)需要with(noexpand)强制查询提示
- 为什么需要将继承层次中类的析构函数定义成virtual的?
- 2015年你需要学习的15种编程语言
- 为什么url需要编码和解码
- 为什么有些编程语言的数组要从零开始算
- 从程序员的角度来看为什么我们需要工作流
- 为什么说基于TCP的移动端IM仍然需要心跳保活?
- Internet为什么需要IP地址和MAC地址?