栈(stack)可以看成是一种“特殊的”线性表,这种线性表上的插入和删除运算限定在表的某一端进行。允许进行插入和删除的这一端称为栈顶,另一端称为栈底。处于栈顶位置的数据元素称为栈顶元素。
堆 (heap)
内存的组成部分,保留给程序用于临时存储数据结构,这些数据结构的存在或大小在程序运行之前都无法确定。
值类型的变量就保存在堆栈上,而引用类型的就保存在堆上这句话如何理解?
1 每一个应用程序都有其自己的内存地址。一部分内存空间用于存放程序代码,一部分内存空间用于存放程序执行期间 。理解堆的最好的方法是将它看成一个程序随时可以使用的内存块。(相当于全局变量)为了创建堆变量,程序要使用“new”(在C++里)操作符或者 “malloc”(在C中)例程,它们返回指向变量的指针(堆变量总是通过指针来处理和操作)。最后程序用“delete”(在C++里)操作符 或者“free”(在C中)例程来删除或者释放内存空间。 分配在堆里面的,则不会释放,需要垃圾回收器发现无用,然后释放
而堆栈则不同,C#中分配在堆栈里面的,在函数退出的时候就释放了。它是某个函数被调用后随时可以创建的一小块内存,被用于在函数范围内保存变量(也称为自动变量)。在函数中,任何 包含在{}内的代码都有其自己的堆栈。当这个函数或者{}退出时,堆栈以及它包含的所有内容都被摧毁。
2 堆和堆栈是两块不同的空间,堆栈是为函数及其参数、内部变量等开辟的空间,结构为数据结构中的栈结构,一般来说栈空间比较小(在C++中是这样的,C++的栈空间总计为2MB,C#还不是特别清楚)。堆空间是程序可以使用的附加空间,空间比较大(一般不超过4GB)。总体来说值类型存在堆栈中,引用类型存在堆中,堆栈的速度比较快
总的来说就是堆栈用来存放临时变量,空间比较小的内存空间,在函数结束的时候就内存里的 变量就被摧毁了。而堆是用来存放全局变量的,空间比较大 (好象是4GB的)的内存空间,它不会自动释放,必须需要垃圾回收器器来清理。堆栈存放值变量,而堆存放引用变量。