翻译自:https://www.quora.com/Why-are-heaps-used-for-memory-allocation-Why-arent-stacks-or-any-others-used
我们需要知道的最重要的事情是栈的功能和堆的功能这两者是有显著区别的。
在一个典型的编程语言中,在一个方法调用的时候,一个“栈帧”就会被创建出来。随后,所有的该方法的本地变量就会在这个栈帧的范围中被创建。然后,当这个方法返回的时候,该方法的栈帧就被“删除”了。这些都是“自动”的。高层开发人员不需要在方法调用的时候去创建栈帧,也不需要在本地变量创建或使用的时候把它们放到栈帧上,也不需要在方法返回的时候删除栈帧。底层的运行时系统会提供上述所有的功能。
但是,从根本上来说,栈还有个大问题:变量(或对象)等在栈帧上生成,但是所有的变量和对象也会随着方法的返回一起消失!所以,如果你想要使一个变量在多个方法中共享,那么,栈不像是一个能够创建该变量的好的地方。
也就是说,我们需要有一个地方能够创建跨越方法调用的变量。这个地方显然不是在栈中。我们把这个可以用来随意放数据的内存堆叫做什么呢?Hmm!就叫堆好了,大概我们的计算机大佬们就是这样决定的。
另外一个非常重要的点是你在堆上可以“随意地”分配,只要堆还有空间,内存分配就会成功。从另一个角度说,你在堆上分配的所有内存可以在任意时间被释放掉!而栈不会给你这个“在栈上释放对象的”自由因为这可能导致栈运行混乱掉。
内存中的栈用数据结构中的栈来实现刚好是个巧合,但是内存的堆和数据结构中的堆没有任何关系。在这种情况下,我感觉我们只需要把堆看成内存的中的“一堆”就好了…意味着一块大的,无条理的内存区域,我们可以在这块内存区域上存储数据,也可以删除数据。