.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;
    }

两都之间相关的时间有很多大的区别,相信大家都能看到。

有些基础性的东西,自己了解的还是比较少,还需要更好的学习。希望自己能够每天学习学习一点儿,不进则退,在这个时代,自己也需要谨记。

 

posted @ 2013-10-27 09:30  124882511  阅读(326)  评论(0)    收藏  举报