C#堆和堆栈有什么区别
2012-11-25 23:21
225 查看
首先堆栈和堆(托管堆)都在进程的虚拟内存中。(在32位处理器上每个进程的虚拟内存为4GB)堆栈stack 堆栈中存储值类型。堆栈实际上是向下填充,即由高内存地址指向地内存地址填充。堆栈的工作方式是先分配内存的变量后释放(先进后出原则)。堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突!堆栈的性能非常高,但是对于所有的变量来说还不太灵活,而且变量的生命周期必须嵌套。通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内数据仍然可以使用。此时就要用到堆(托管堆)!
堆(托管堆)heap堆(托管堆)存储引用类型。此堆非彼堆,.NET中的堆由垃圾收集器自动管理。与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。比如创建一个对象:Customer cus;cus = new Customer();申明一个Customer的引用cus,在堆栈上给这个引用分配存储空间。这仅仅只是一个引用,不是实际的Customer对象!cus占4个字节的空间,包含了存储Customer的引用地址。接着分配堆上的内存以存储Customer对象的实例,假定Customer对象的实例是32字节,为了在堆上找到一个存储Customer对象的存储位置。.NET运行库在堆中搜索第一个从未使用的,32字节的连续块存储Customer对象的实例!然后把分配给Customer对象实例的地址赋给cus变量!
从这个例子中可以看出,建立对象引用的过程比建立值变量的过程复杂,且不能避免性能的降低!实际上就是.NET运行库保存对的状态信息,在堆中添加新数据时,堆栈中的引用变量也要更新。性能上损失很多!有种机制在分配变量内存的时候,不会受到堆栈的限制:把一个引用变量的值赋给一个相同类型的变量,那么这两个变量就引用同一个堆中的对象。当一个应用变量出作用域时,它会从堆栈中删除。但引用对象的数据仍然保留在堆中,一直到程序结束 或者 该数据不被任何变量应用时,垃圾收集器会删除它。
堆(托管堆)heap堆(托管堆)存储引用类型。此堆非彼堆,.NET中的堆由垃圾收集器自动管理。与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。比如创建一个对象:Customer cus;cus = new Customer();申明一个Customer的引用cus,在堆栈上给这个引用分配存储空间。这仅仅只是一个引用,不是实际的Customer对象!cus占4个字节的空间,包含了存储Customer的引用地址。接着分配堆上的内存以存储Customer对象的实例,假定Customer对象的实例是32字节,为了在堆上找到一个存储Customer对象的存储位置。.NET运行库在堆中搜索第一个从未使用的,32字节的连续块存储Customer对象的实例!然后把分配给Customer对象实例的地址赋给cus变量!
从这个例子中可以看出,建立对象引用的过程比建立值变量的过程复杂,且不能避免性能的降低!实际上就是.NET运行库保存对的状态信息,在堆中添加新数据时,堆栈中的引用变量也要更新。性能上损失很多!有种机制在分配变量内存的时候,不会受到堆栈的限制:把一个引用变量的值赋给一个相同类型的变量,那么这两个变量就引用同一个堆中的对象。当一个应用变量出作用域时,它会从堆栈中删除。但引用对象的数据仍然保留在堆中,一直到程序结束 或者 该数据不被任何变量应用时,垃圾收集器会删除它。
相关文章推荐
- C++ C# VC VC.net以及VC++有什么区别和联系?
- C#里面Console.Write()和Console.WriteLine()有什么区别?
- C语言和C++ C#的区别在什么地方?
- C,C#,C++,这些有什么区别和联系呢
- c#中委托和直接函数调用用什么区别,好处和目的在哪?
- c# 运算符 &&和&有什么区别
- c#中List、Dictionary、ArrayList、Hashtable和数组的区别是什么?
- C#中F5和ctrl+F5的区别是什么?
- c#中Dictionary、ArrayList、Hashtable和数组的区别是什么
- c#中Dictionary、ArrayList、Hashtable和数组的区别是什么?[转]
- C#项目obj和bin文件什么区别和联系
- java中堆(heap)和堆栈(stack)有什么区别
- java中堆(heap)和堆栈(stack)有什么区别
- java中堆(heap)和堆栈(stack)有什么区别
- C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
- 深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别
- c#中Dictionary、ArrayList、Hashtable和数组的区别是什么?[转]
- C#中bool与Boolean有什么区别?string和String区别?
- java中堆(heap)和堆栈(stack)有什么区别
- C#中(int)a和Convert.ToInt32(a)有什么区别