UnityC#反射底层原理

一、C#对象的内存布局

二、this实例的概念

成员函数里面,如果我们使用this,指的就是当前的对象实例;

调用这个成员函数的时候,我们会自动给成员函数,把当前的对象的实例作为this传入进去;

类的实例:类的数据成员的所有数据(看得见的,age,4个字节,sex,四个字节,string 引用类型变量(4字节),32位系统下)

看不见的数据:编译器对齐;

组成了一个类的实例;t-->一块内存,写好代码以后编译器会定死一个偏移,age,在我对象实例里面,内存偏移多少,大小为age类型

当我们编写好一个类型以后,

(1)我们的编译器会知道每个数据的相对于对象实例内存块的偏移;

(2)我们编译器也会知道,每个类的成员函数在代码段偏移位置;--》运行的时候,就可以让指令直接跳转到这里,函数调用;

三、什么是反射,反射有什么作用

Unity游戏引擎为例,来看反射的作用

Unity:编译器上挂脚本,我们给脚本初始化数据

编辑完了以后---》保存到场景文件里面

运行的时候,我们就根据场景文件里面的内容,游戏引擎把这个节点和组件实例new出来

反射来做

上面我们描述一个类,每一个类是一种类型,都有自己独立的描述

所以我们新加一个类,就会有多的一种方式来描述

我们没有办法用统一的方式来处理不同的类或类的实例

要解决上述我们问题的本质矛盾是什么?

需要用一种方式来描述任意的类

任意的类,都可以转化成这样一种描述

a:类的实例是一个内存块,内存块的大小就是这个类的所有数据成员的大小-----》类的实例的内存块大小

b:类有哪些数据成员,我们可以把这些数据成员的名字,通过数组等其他方式保存起来

数据成员数组:

c:类有哪些成员函数

定义了这样一种描述方式,我们就解决上面的问题,我们用同一的方式来描述任意不同的类型

四、类型描述 对象实例(Type,System)是什么

每个类,我们的编译器都知道 数据成员的偏移,函数代码段的位置

编译完成了以后,我们就可以根据我们的编译信息,来为每个类,来生成一个

类型描述的对象的数据,存起来,写入到我们的.exe

我们的就可以使用了Type的方式来获得一个类的描述

底层就可以根据类的描述来构建实例,调用方法,和成员了

调用底层OS的API来分配一个xxxx大小的内存出来,作为对象实例的内存

调用构造函数,将这个内存块传递给构造函数,构造函数就会帮我们初始化对应的数据

相关推荐
会思考的猴子8 小时前
Unity VFX 属性 Postion 和 TargetPostion
unity
hai31524754312 小时前
九章编程法 · 猜数字游戏 (GW-BASIC 重构版) *
人工智能·microsoft·游戏引擎·游戏程序
思麟呀14 小时前
在C++基础上理解CSharp-5
开发语言·c++·c#
心前阳光16 小时前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光16 小时前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯17 小时前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
z落落18 小时前
C#ToolStrip+StatusStrip 状态栏实时显示系统时间+NotifyIcon系统托盘
开发语言·c#
龙智DevSecOps解决方案18 小时前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
ctrl_v助手19 小时前
VisionPro (R) QuickBuild相机的连接
服务器·笔记·数码相机·c#
葛兰岱尔19 小时前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity