堆栈的关系、原理、区别以及如何按照自己的方式工作
本文是我自己所整理,可能存在错误或争议,欢迎评论指正或讨论!
堆(heap) 栈(stack)
虽然在.net framework不需要内存管理和垃圾回收,但应该了解,有助于解释日常程序编写中变量的行为。
代码执行时,会分配两个内存,堆栈,用来存储代码,帮助运行程序,它们驻留在机器内存中,包含所有代码执行的所需要的信息。
栈负责保存我们的代码执行(或调用)路径,而堆则负责保存对象(或者说数据)的路径。
可以把栈想象成一堆从顶向下堆起来的盒子。每调用一次方法时,我们将应用程序中所要发生的事情记录在栈顶的一个盒子中,每次只能够使用栈顶的那个盒子。
堆的工作原理比较相似,但大多数时候堆用作保存信息而不是保存执行路径,与栈相比堆没有任何访问限制,
栈是自行维护的,也就是说内存自动维护栈,当栈顶的盒子不再被使用,它将被抛出。相反的,堆需要考虑垃圾回收,垃圾回收用于保持堆的整洁性。
栈和堆中主要放置了四种类型的数据:值类型,引用类型,指针,指令。(c#前两个)
值类型:
在C#中,所有被声明为以下类型的事物被称为值类型:
bool
byte
char
decimal
double
enum
float
int
long
sbyte
short
struct
uint
ulong
ushort
2.引用类型:
所有的被声明为以下类型的事物被称为引用类型:
class
interface
delegate
object
string
举例子:
public int ReturnValue()
{
int x = new int();
x = 3;
int y = new int();
y = x;
y = 4;
return x;
}
我们将得到值3,很简单,对吧?
假如我们首先使用MyInt类
public class MyInt
{
public int MyValue;
}
接着执行以下的方法:
public int ReturnValue2()
{
MyInt x = new MyInt();
x.MyValue = 3;
MyInt y = new MyInt();
y =x;
y.MyValue =4;
return x.MyValue;
}
我们将得到什么?... 4!
栈的访问速度快,堆的数据量大,所以慢。