.NET堆和栈的比较
堆和栈的相信大家都了解,具体的区别可能也很少研究。这几天看到一篇文章介绍了堆和栈的区别,讲得很详细,我也按照文章做了示例,现将具体的测试过程记下来。
文章来源地址:http://www.cnblogs.com/c2303191/articles/1065675.html
以下是我的理解
1、栈负责保存我们的代码执行或调用路径,而堆负责保存对象或都说是数据
2、执行总是由栈顶开始,执行完毕之后,代码扔掉,所以当前执行的总是栈顶的东西。
3、栈是自行维护的,因为栈执行完毕之后,总是扔弃了当前的东西,而进入下一个栈。而堆则是记录了数据的或是对象的信息,所以堆的位置可能是无序。但是却保存了各对象的信息,栈执行时需要某个数据,都可从里面取到。
4、堆和栈中主要放置了4种类型的数据:值类型,引用类型,指针,指令。
5、引用类型放在堆中,当我们使用引用类型时,其实处理的是该类型的指针,而非该类型本身。
6、值类型和指针总是放在它们声明的地方。当我们使用值类型时,我们是在使用值类型机身。
以下是引用类型示例:
public class SotckSimple { public static int Test() { MyInt a = new MyInt(); a.MyVal = 3; MyInt b = new MyInt(); b = a; b.MyVal = 4; Console.WriteLine(a.MyVal.ToString()); //这里返回的即是4,因为b指向a的指针引用了,即改变b对象,将会映射到a对象相关的数据 return a.MyVal; } } class MyInt { public int MyVal { get; set; } }
值类型的示例我就不做了,没啥意思。 7、struct结构体是一个存放大量值类型的数据体,值总是存储在栈上的,使用时必须小心。
示例结果如下:

/// <summary> /// 结构体的运行速度测试 /// </summary> public class StructSimple { public static void TestClass() { int length = 10000; DateTime time = DateTime.Now; for (int i = 0; i < length; i++) { MyStructClass my = new MyStructClass(); my.a = i; DoSomeing(my); } DateTime etime = DateTime.Now; Console.WriteLine((etime - time).ToString()); } public static void TestStruct() { int length = 10000; DateTime time = DateTime.Now; for (int i = 0; i < length; i++) { MyStruct my = new MyStruct(); my.a = i; DoSomeingStruct(my); } DateTime etime = DateTime.Now; Console.WriteLine((etime - time).ToString()); } static void DoSomeing(MyStructClass c) { string v = c.ToString(); } static void DoSomeingStruct(MyStruct c) { string v = c.ToString(); } } class MyStructClass { public long a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, s, t; } struct MyStruct { public long a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, s, t; }
两都之间相关的时间有很多大的区别,相信大家都能看到。
有些基础性的东西,自己了解的还是比较少,还需要更好的学习。希望自己能够每天学习学习一点儿,不进则退,在这个时代,自己也需要谨记。
笨鸟先飞

浙公网安备 33010602011771号