很多人对于堆和栈的区别都感到迷惑,因此我们列出了许多堆和栈的问题和回答,或许对你有帮助。
1. 堆和栈存储在哪里?
堆和栈都存储在计算机的RAM(Ramdon Access Memory)中。阅读 How Virtual Memory Works 了解更多RAM的内容。
2. 线程是如何操作堆和栈的 ?堆和栈在多线程条件下是如何工作的?
在一个多线程的应用程序中,每一个线程都会有它自己的栈。但是,所有的线程都会共享堆。在一个多线程的应用程序中,由于不同的线程共享堆,因此线程之间必须协作以保证它们不会在同一时间访问或操作堆中的相同内存。
3. 栈和堆中的内存都存储多久呢?
一旦一个函数运行完成了,该函数的栈中的数据将会被自动删除。而堆中的任何数据需要程序手动删除(或者通过垃圾回收机制回收),否则将将会一直保留在堆中。
4. 栈的大小可以增加吗?堆的大小可以增加吗?
栈被设置成固定的大小,并且大小不能增加(有些语言做了扩展允许增加栈大小)。因此,如果栈上没有足够的空间去分配内存,会发生stack overflow错误。这种情况常常发生如果有许多嵌套的函数被调用,或者这儿有个死循环调用。
如果分配内存的时候堆的空间不够,那么操作系统会给堆增加内存。这是堆和栈最大的区别之一。
5. 堆和栈是怎么实现的?
堆和栈的实现依赖于语言,编译器和运行时。
6. 堆和栈哪个更快?为什么?
栈是更快且开销更小。这是因为栈上内存分配的方式:栈上分配内存是非常简单的,只需要向上移动栈指针。
7. 栈和堆上的内存是如何回收的?
当变量超出范围(?)时,栈上的数据是自动回收的。在C和C++中,堆中存储的数据必须由开发者利用以下关键字free,delete,或者delete[]手动删除。其它语言像Java和.NET使用垃圾回收去自动从堆中删除内存,而不需要开发者做任何事。
8. 栈和堆用哪一个?
不同的语言有不同的机制。
原文链接: difference-between-stack-and-heap
我做了什么:搬运原文,简单翻译,保留了一些通用的问题和回答。如有错误,欢迎指正。
网友评论