前言
为Unity面试而准备一些问题,如果有什么说的不对的,欢迎指正
语言机制类
1、GC机制
在C/C++中程序员要自己负责系统的内存管理,而C#采用Garbage Collection自动回收内存,
当Java虚拟机(VM)或.NETCLR发觉内存资源紧张的时候,就会自动地去清理无用对象(没有被引用到的对象)所占用的内存空间,
查找没有被引用的对象有一系列的算法,
Lua语言的GC机制采用是Mark and Sweep算法。
2、协程线程进程
进程一个具有独立功能的程序在一个数据集合上的一次动态执行过程(程序是静态的代码,进程是动态执行的过程)
线程:进程是分配资源的基本单位,而线程则是系统调度的基本单位。
一个进程内部的线程可以共享该进程的所分配到的资源。线程的创建与撤消,线程之间的切换所占用的资源比进程要少很多。
总的来说就是为了更进一步提高系统的并发性,提高CPU的利用率。
协程:是一种比线程更加轻量级的存在,协程调度不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行),你可以随时把它挂起。
一个线程里可以有多个协程。协程的切换几乎没有操作系统的内核开销,不会像线程切换那样消耗资源(线程切换要改Context)。
协程的一大好处就是可以避免数据访问冲突的问题因为它的粒度相对多线程的大很多,所以往往很少出现冲突现象。协程写入死循环会将线程卡死。
(配图有些问题,yield return null是让协程在下一个yield null执行,如果在update前启动了协程,那么在update后的yield的null是会执行的)
3、装箱与拆箱
值类型变量封装object类型变量或者对应的object将这个值类型从栈区copy到堆区产生一个引用类型叫做装箱;
把这个堆上的obj转成值类型,从堆上往栈上搬东西叫做拆箱,装箱和拆箱会损失一定性能。
按理说C#被设计成一种完全面向对象的语言。因此,包括数字、字符、日期、布尔值等等在内的一切,都是对象。似乎只需要一种方式来对待这些对象就可以了。
但是C#必须为性能而妥协,我们知道,对于CPU来说,处理一个完整的对象,需要很多的指令,
对于内存来说,又需要很多的内存。如果连整数都是对象,那么性能自然很低。
C#于是使用了一种机制,使得这些基本类型在一般的编程中被当作非对象的简单类型处理,
在另一些场合(比如需要多个脚本引用同一个对象)又允许它们被视作是一个对象。(摘自评论)
4、值类型和引用类型的区别
值类型的数据存储在内存的栈中,引用类型的数据存储在内存的堆中
值类型存取速度快,引用类型存取速度慢
类型表示实际数据放在栈中;引用类型表示指向存储在内存堆中的数据的指针或引用,在栈中存放实际数据的地址,堆上存放实际数据
栈的内存分配是自动释放;而堆在.NET中会有GC来释放
值类型继承自System.ValueType,引用类型继承自System.Object
5、lua如何实现面向对象?lua的元表?
由于暂时没怎么学lua,TODOOOOOOOOOO
6、闭包
闭包是指有权访问另一个函数作用域中的变量的函数
闭包这个词本身指的是一种函数。而创建这种特殊函数的一种常见方式是在一个函数中创建另一个函数。
闭包中引用的变量实际上就是把原来声明在主体中的变量转移到用匿名密封类或者结构体里,
最终在主体中访问的变量就是生成的匿名类中对象。来自博客
C#里可以在函数里放一个委托或者匿名函数引用局部变量。