[转]C#堆和栈的区别

news/2024/7/20 13:30:38 标签: c#, 内存管理, 操作系统

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

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

堆(heap):

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

栈(stack):

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

对象内存的分配与销毁:

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

C#中的深拷贝与浅拷贝

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

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

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

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


http://www.niftyadmin.cn/n/1391136.html

相关文章

第三章、局域网络架构简介

在这一章当中,我们会继续讨论在一个小型企业或家庭里面的小型局域网络规划,以让的所有计算机主机都可以直接利用以太网络进行数据的连接啊! 一般来说,内部局域网络都希望直接使用私有 IP 来设定沟通环境,直接以简单的星…

碉堡了!体验QQ自带“全透明”皮肤!

“透明”一直是美化控们的终极目标,网上经常能够看到各种大大们自己制作的QQ全透明皮肤。不过你能想到最新版QQ 2012已经自带全透明皮肤了吗?而且我要告诉你的是,腾讯的这次“透明”并不限于某款皮肤,而是可以应用在任何一款已有的…

linux系统使用心得

接触Linux很长时间了,当时还是受到同学的影响,看着有专业的样子,还是真有点羡慕,不过那时我还没有机器可用,惨~ 所以一有时间和条件我就可以学习一下unix或者linux,这些我在东京留学的时候用得比…

软件移植:从win32到x64 .(转)

随着软件对计算机主存的需求的扩张,32位平台的4G主存寻址空间逐渐成为机器性能的瓶颈,长期来看,解决这一矛盾的最优方案是使用支持更大主存空间的软件运行平台。就当前来所,PC机上支持更大地址空间的硬件平台就是x64了&#xff0c…

APMServ修改php默认目录

步骤1&#xff1a;点击Appache设置 步骤2&#xff1a;需要修改的地方&#xff08;httpd.cof&#xff09; DocumentRoot "E:/www/aaa" <Directory "E:/www/aaa"> NameVirtualHost *:8080 <VirtualHost *:8080> ServerName * DocumentRoot …

第四章、连上 Internet

终于要来到修改 Linux 网络参数的章节了&#xff01;在第二章的网络基础中&#xff0c; 我们知道主机要连上 Internet 需要一些正确的网络参数设定&#xff0c;这些设定在 Windows 系统上面的修改则在第三章的局域网络架构中说明了。在这一章当中&#xff0c;我们则主要以固定 …

怎样用 Android Annotations 写出高性能代码

上一篇博文中简单介绍了 Android Annotations 的基本用法&#xff0c;顺便扯了一下概念 - 契约编程&#xff0c;阅读量少的可怜&#xff0c;看来并没有多少人对此感兴趣&#xff0c;今天再来一篇&#xff0c;介绍几个稍微高级点的用法&#xff0c;我就不信弄不出一个大新闻。 本…

[C#]强类型

首先声明&#xff0c;这篇文章仅仅是个人的学习体会&#xff0c;并不是标准资料。如果有什么谬误&#xff0c;欢迎高手指出。object o1 new object();string s1 o1.ToString(); // s1 will be "System.Object"object o2 "hello";string s2 o2.ToStr…