关于堆和栈 stack & heap(1)

https://www.programmerinterview.com/data-structures/difference-between-stack-and-heap/

很多书都会说,值类型 value type 存在堆里,引用类型 reference type 存在栈里,但都没有解释为什么是这样,它们在内存中的什么位置,它们的作用域是什么,什么决定了它们的大小,为什么stack更快?

堆和栈的区别?

堆和栈在哪里?

它们都存在计算机内存中 RAM(Random Access Memory)

线程是如何与堆栈交互的,多线程如何与堆栈工作的?

在多线程的应用中,每个线程都有自己的堆。但所有的线程都会共用一个栈。而因为所有的线程都共用一个栈,所以需要一些协调,以保证它们不会同时访问或更改同一个栈中的存储区。

对象存储在堆或栈中

如果在函数中不使用new创建一个对象的话,那这个对象就存储在堆中。当这个函数执行完成后,这个对象就会被销毁,然后从堆中删除。

Code to create an object on the stack:

···
void someFunction()
{
/* create an object "m" of class Member this will be put on the stack since the "new" keyword is not used, and we are creating the object inside a function */

    Member m;

} // the object "m" is destroyed once the function ends

Code to create an object on the heap:

void someFunction()
{
 /* create an object "m" of class Member this will be put on the heap since the "new" keyword is used, and we are creating the object inside a function */

        Member* m = new Member();

/* the object "m" must be deleted otherwise a memory leak occurs */

delete m;
}


## 堆和栈的存续时间

当函数运行结束后,该函数在堆上的所有存储将被自动清空。而栈上的数据必须由用户手动清理。

## 堆和栈的空间会扩大吗?
堆的空间是固定的(虽然有些语言可以通过扩展以实现)。因此,如果堆的空间满了之后,如果再要存进数据,则会发生堆溢出 stack overflow。当调用大量的嵌套函数nested function 或 无限递归函数,则有可能发生stack overflow。

## 堆和栈是如何实现的?
堆栈的实现是依赖于语言、编译器和运行时的。


## 堆和栈,哪个更快
堆要比栈快很多。这主要是由于在堆上的存储空间分配方式。在堆上的寻址就是简单将指针上移。LIFO last in first out.


## 堆栈都会出现哪些错误
当堆满了之后,就会出现堆溢出导致程序崩溃。
栈可能出现的问题与碎片有关,当栈上的非连续存储块。当new一个对象时,如果heap没有一个足够的“块儿”的时候,将会出错。

## 应该用堆还是用栈?
当不清楚需要多大空间的时候,最好用heap。






What’s the difference between a stack and a heap?
The differences between the stack and the heap can be confusing for many people. So, we thought we would have a list of questions and answers about stacks and heaps that we thought would be very helpful.

你可能感兴趣的:(关于堆和栈 stack & heap(1))