当前位置:  编程技术>.net/c#/asp.net

C#栈和堆的区别浅谈

    来源: 互联网  发布时间:2014-10-16

    本文导语:  理解堆与栈对于理解.NET中的内存管理、垃圾回收、错误和异常、调试与日志有很大的帮助。垃圾回收的机制使程序员从复杂的内存管理中解脱出来,虽然绝大多数的C#程序并不需要程序员手动管理内存,但这并不代表程序员就...

理解堆与栈对于理解.NET中的内存管理、垃圾回收、错误和异常、调试与日志有很大的帮助。垃圾回收的机制使程序员从复杂的内存管理中解脱出来,虽然绝大多数的C#程序并不需要程序员手动管理内存,但这并不代表程序员就无需了解分配的对象是如何被回收的,在一些特殊的场合仍需要程序员手动进行内存管理。

在32位的处理器上,每个进程的虚拟内存为4GB,.NET会在这4GB的内存块中开辟出3块内存,分别作为栈、托管堆、和非托管堆

堆(heap):

堆是从下往上分配,所以已用的空间在自由空间下面,C#中所有引用类型的对象分配在托管堆上,托管堆在内存上是连续分配的,并且内存对象的释放受垃圾收集机制的管理,效率相对于栈来说要低的多。

栈(stack):

栈是自上向下进行填充,即由高内存地址指向低内存地址,并且内存分配是连续的,C#中所有的值类型和引用类型的引用都分配在栈上,栈根据后进先出的原则,依次对分配和释放内存对象。

对象内存的分配与销毁:

当一个类的实例对象创建的时候,这个对象的不同成员按类别被分配到了不同的内存区域,值类型和引用类型的指针被分配到了栈上,引用类型的实例对象被分配到了托管堆上,静态成员被分配到了全局数据区。此时栈上的指针会指向堆上的对象。当对象使用完以后,引用和实际对象的联系就会断开,从而从而使对象冬眠。因为栈具有自我维护性,它的内存管理可以通过操作系统来完成,而此时堆上的冬眠对象就需要通过垃圾回收器(GC)使用一定的算法来进行回收,释放对象所占据的内存。

C#中的深拷贝与浅拷贝

深拷贝:又称深度克隆,它完全是新对象的产生,不仅复制所有的非静态值类型成员,而且复制所有引用类型成员的实际对象。(即栈上和堆上的成员均进行复制)

浅拷贝:又称影子克隆,只复制原始对象中的所有的非静态的值类型成员和所有引用类型成员的引用,就是说,原始对象和新对象共享所有引用类型成员的对象实例。(即只复制栈上的成员)

注:不管是深拷贝还是浅拷贝,都不会复制全局数据区的成员,因为全局数据区的成员是静态成员,它属于某一个类,并不属于类的实例对象,因此无法复制。

C#中的深拷贝可以通过实现ICloneable接口来实现,但是在不是必须实现ICloneable接口的情况下,应避免类型继承ICloneable接口。因为这样做将强制所有的子类必须实现ICloneable接口,否则子类的新成员将不能被类型的深拷贝所覆盖。


    
 
 

您可能感兴趣的文章:

  • c#中 String和string的区别介绍
  • C#中常量和只读变量的区别小结
  • C#中String与string的区别分析
  • C#中Action和Func的区别
  • C# DoubleClick与MouseDoubleClick区别,双击事件引发顺序
  • C#中Convert.ToInt32()和int.Parse()的区别介绍
  • c# ref与out参数区别与例子(图文)
  • C#中Convert.ToString和ToString的区别分析
  • C#中FormClosing与FormClosed的区别详细解析
  • C#中抽象方法与虚拟方法的区别
  • js substr,substring与java substring和C# substring的区别解析
  • C#中string和StingBuilder内存中的区别实例分析
  • c#(asp.net) new与override的区别
  • C#中out与ref的区别实例解析
  • C# 静态方法与非静态方法的区别分析
  • NOSQL iis7站长之家
  • c#只读字段和常量的区别,以及静态构造函数的使用实例
  • C#中值类型与引用类型作为参数传递时的区别
  • C#(int)中Convert、Parse、TryParse的区别
  • C#中属性和成员变量的区别说明
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 测试Python内部类型及type和isinstance用法区别
  • 请问 中科红旗与其他通常所用的linux有何区别 另外linux和unix有何区别
  • Linux/CentOS下的CST和UTC时间的区别以及不一致的解决方法
  • 请问rm和unlink区别,link和ln的区别
  • redis和mongodb区别详细介绍
  • 请问ncurses与curses有区别吗?有什么区别?在这两个库下编写的程序通用吗?
  • 正向代理与反向代理概念及其区别
  • 高手请赐招:数字签名与数字认证的区别,尤其是概念上的区别。谢谢!
  • linux ramfs和tmpfs区别及用法介绍
  • linux,Unix以及windows主要都有什么区别啊,包括系统内核和用户所能感觉到的区别
  • HTML 区块元素:<DIV>和 <SPAN>各自的定义与区别详细介绍
  • 请问各位对操作系统有研究的高手门,unix和linux,到底有多大的区别?区别在那里?其内核究竟有多少是相同的?
  • c/c++中的内存分配 malloc 和 new介绍及相互之间的区别
  • Class与ID区别 margin和padding区别 CSS学习笔记
  • docker和VM虚拟机的区别以及如何用docker搭建基础设施
  • 浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别
  • XHTML 详细介绍以及xhtml与html的区别
  • 请告诉我---Java2是什么东东?和Java有什么区别?JDK是什么?和JBuilder有什么区别?
  • 请问一下红色字体处的区别,及pthread_self()和pthread_creat()函数第一个参数的区别?
  • 请问这两句话有什么区别?
  • Linux和Unix是什么区别啊?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3