您的位置:首页 > 理论基础 > 数据结构算法

问题一,要想进外企,英语当然要硬,其他的要看你对数据结构的理解,先总结一下。

2009-04-13 15:16 309 查看
好像进外企,考的就是基础。有一次猎头打电话过来也说了就是微软考的基础的题感觉很变态。比如说做网站哪用的到知道堆栈和堆应用上的不同啊。所以很纳闷。不过反过来想想,你开发东西多了,这里边有些概念会理解的更深一些,比如说接口和抽象类的应用等。下边是找的一些资料:

1,什么是GC

GC的全称是garbage collection,中文名称垃圾回收,是.net中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。在进行垃圾回收时,垃圾回收器回首先搜索内存中的托管对象,然后从托管代码中搜索被引用的对象并标记为有效,接着释放没有被标记为有效的对象并收回内存,最后整理内存将有效对象挪动到一起。这就是GC的四个步骤。

由上可见,GC是很影响性能的,所以一般说来这种事情况还是尽量少发生为好。

为了减少一些性能影响,.net的GC支持对象老化,或者说分代的概念,代是对象在内存中相对存现时期的度量单位,对象的代数或存现时期说明对象所属的代。目前.net的垃圾回收器支持三代。每进行一次GC,没有被回收的对象就自动提升一代。较近创建的对象属于较新的代,比在应用程序生命周期中较早创建的对象的代数低。最近代中的对象位于零代中。每一次GC的时候,都首先回收零代中的对象,只有在较低代数的对象回收完成后仍不能满足需求的情况下才回收较高代数的对象。

2,GC和堆栈、堆

由前述堆栈和堆的概念可以看出,堆栈不存在垃圾收集的问题,只需要直接压栈即可,而堆,则面临着很复杂的垃圾回收的问题。GC完全是对堆进行操作的,而对堆中对象是否有效的判断则是通过遍历堆栈来实现的。这里涉及到一个引用计数的概念,引用计数是对堆中对象被引用次数的统计,当一个对象的引用计数为零了,那么这个对象就可以被回收了。在进行GC的时候,垃圾回收器遍历堆栈,当发现一个堆地址的时候,它就将堆中该地址上的对象的引用计数加1,然后销毁堆中所有引用计数为零的对象,回收内存并整理堆中的碎片。

3,类实例化的步骤

类是最常见也是我们用的最多的一种引用类型,我们知道实例化一个类使用的是一个我们司空见惯的语句:

ClassA ca = new ClassA();

那么这短短的一句话中,计算机又做了些什么事情呢?

实际上,计算机在这个过程中大致做了这么几件事:

首先,在ClassA ca的时候,生成一个空的引用指针,并将它推入堆栈中:

然后,在new ClassA()的时候,生成ClassA的新的实例,并放入堆中:

在赋值号=这一步,将ca的引用指针指向刚刚生成的新实例:

这个时候,才算完成了整条语句的操作。

4,C#中值类型分配在堆栈中。

值类型:bool,byte,char,decimal,double,enum,float,int,long,sbyte,short,struct,uint,ulong,ushort.

5,C#中引用类型分配在堆中,在堆栈中创建一个指向到堆的引用,返回给声明的变量。

引用类型:class,delegate,interface,object,string

备注:1. 值类型数组虽然分配在堆上,但数组元素依然是值类型,并没有被装箱。

2, 引用对象的值类型成员也随对象一起分配在堆上,同样也还是值类型,没有被装箱
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐