版权声明:本文为博主原创文章,欢迎转载。请保留博主链接:http://blog.csdn.net/andrewfan

指令格式 英文单词全写 指令解释
nop no operation performed 不做任何操作,留待后续版本补齐此操作码功能
ldc.i4 num load const 将操作常数数num推送到计算堆栈.
其中i4代表int32常数,栈顶结果为int32;
ldc.i8,代表推送int64常数,结果为int64;
ldc.i4.s,代表推送int8,结果为int32;
ldc.i4.m1,代表推送-1(minus 1),结果为int32;
ldc.r4,代表推送float32,结果为float32;
ldc.r8,代表推送float64,结果为float64;
ldloc n load local 加载第n个本地变量到计算堆栈;
ldloc.n,n取0~3,代表加载n处的本地变量;
ldloc.s n,短格式,针对0~255之间数值,更高效;
ldloca index load local 加载第n个本地变量的地址到计算堆栈;
ldloca.s 短格式
stloc.n stack local 弹出计算堆栈上的栈顶元素,存储到本地变量列表(即调用堆栈)的第n个位置,即赋值给第n个局部变量(函数参数也被编译为局部变量)
box valTypeToken box 装箱,将值类型封装成valTypeToken指定的对象类型,流程是,弹出计算堆栈上的值类型参数,并使用新建立的一个引用类型对象进行并包装,将包装结果返回计算堆栈。本过程产生GC Alloc。
unbox valType unbox 拆箱,将引用类型转换成相应值类型valType,流程是,弹出计算堆栈上的引用类型参数,并执行拆箱转换,将转换完成的值类型结果推送回计算堆栈
unbox.any typeTok unbox any 拆箱,将引用类型转换成相应值类型或者引用类型typeTok,流程与unbox相同,差别是,如果typeTok是值类型,则与unbox相同;如果typeTok是引用类型,则与castclass相同,即执行类型转换
castclass classT cast class 强制类型转换,流程是,将计算堆栈上的参数弹出,并验证其是否是继承了classT指定的class,或者实现于classT指定的接口,如果不是,则引发转换异常;如果转换正常,则把转换后的结果引用返回;如果当前的参数本身是null,则也返回null
initobj typeTok init object 将当前计算堆栈栈顶单元视为某个值类型对象的地址,调用值类型typeTok的初始化方法,将此地址指向的值类型单元置为0,与newobj指令不同 ,initobj不调用构造函数方法。
call methodDesc call method description 应用于早绑定的函数调用,即它不会考虑函数重载。在函数调用之前,传递的参数应该已经被压到计算堆栈上,此时执行call指令,执行完成之后,将会执行ret指令,并将返回值存储到计算堆栈。
callvirt method call method 应用于晚绑定的函数调用,即它会计算函数重载。除此之外,其运行步骤与call相同。【每个函数调用起始,都会有2句话max stack …;.locals init(…),是否是由它们弹出当前计算堆栈上的参数,并存放到当前的局部变量列表(Call Stack)中,所以在返回时,不用关心之前压入参数占据堆栈单元的问题?】
ret return 从当前函数返回,并且将返回值从当前函数的计算堆栈推送到调用者函数的计算堆栈
newobj ctor new object constructor 创建一个新引用类型或者值类型对象实例,并将创建出来的引用压入计算堆栈,并调用其后面跟随的ctor构造函数。如果当前创建的是值类型对象,那么它压入当前堆栈的是内存地址位于当前堆栈上的对象引用。此方法会产生GCAlloc

【Unity优化】我所理解的IL指令的更多相关文章

  1. 【Unity优化】Unity中究竟能不能使用foreach?

    关于这个话题,网络上讨论的很多,我也收集了一些资料,都不是很齐全,所以自己亲自测试,这里把结果分享给大家. foreach究竟怎么了? 研究过这个问题的人都应该知道,就是它会引起频繁的GC Alloc ...

  2. 读<你必须知道的.NET>IL指令笔记

    IL指令笔记: 1.newObj和initObj MSDN解释:newObj用于分配和初始化对象,而initObj用户初始化值类型 newObj解释: (1):从托管堆分配指定类型所需要的全部内存空间 ...

  3. IL指令速查

    名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...

  4. [Unity优化] Unity CPU性能优化

    前段时间本人转战unity手游,由于作者(Chwen)之前参与端游开发,有些端游的经验可以直接移植到手游,比如项目框架架构.代码设计.部分性能分析,而对于移动终端而言,CPU.内存.显卡甚至电池等硬件 ...

  5. 对Conjugate Gradient 优化的简单理解

    对Conjugate Gradient 优化的简单理解) 机器学习&数据挖掘笔记_12(对Conjugate Gradient 优化的简单理解) 数学优化方法在机器学习算法中至关重要,本篇博客 ...

  6. 【Unity优化】构建一个拒绝GC的List

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 上篇文章<[Unity优化]Unity中究竟能不能使用foreach?> ...

  7. 再议Unity优化

    0x00 前言 在很长一段时间里,Unity项目的开发者的优化指南上基本都会有一条关于使用GetCompnent方法获取组件的条目(例如14年我的这篇博客<深入浅出聊Unity3D项目优化:从D ...

  8. Android破解学习之路(十六)—— dll破解的IL指令

    IL指令介绍 IL是.NET框架中中间语言(Intermediate Language)的缩写. 使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不 ...

  9. UNITY 优化之带Animator的Go.SetActive耗时问题,在手机上,这个问题似乎并不存在,因为优化了后手机上运行帧率并未明显提升

    UNITY 优化之带Animator的Go.SetActive耗时问题,在手机上,这个问题似乎并不存在,因为优化了后手机上运行帧率并未明显提升 经确认,这个问题在手机上依然存在,不过占的比例非常小.因 ...

随机推荐

  1. Spring Boot Web Executable Demo

    Spring Boot Web Executable Demo */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.sr ...

  2. Sigmoid函数

    Sigmoid函数是一个S型函数. Sigmoid函数的数学公式为: 它是常微分方程 的一个解. Sigmoid函数具有如下基本性质: 定义域为 值域为, 为有界函数 函数在定义域内为连续和光滑函数 ...

  3. Bash's Big Day

    Bash has set out on a journey to become the greatest Pokemon master. To get his first Pokemon, he we ...

  4. C++第五天学习

    回顾: 1.友元 friend 2.运算符重载 类型 operator运算符(参数表) 抽象.封装 类是面向对象程序设计中最基本的概念 类的背后隐藏的思想是数据抽象和封装 是进行封装和数据隐藏的工具, ...

  5. Tomcat 使用过程中的一些技巧

    url中文地址乱码 原因: tomcat默认的在url传输时是用iso8859-1编码. 解决方案一: 在使用get传输参数时,将参数中的中文转换成url格式,也就是使用urlEncode和urlDe ...

  6. 数据契约(DataContract)的作用

    服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所 ...

  7. PHP + Memcache 实现Session共享

    一.安装Memcache和PHP扩展 Windows下的Memcache安装:1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached2. 在终端(也即cmd ...

  8. CSS3-----图片翻页效果的展示

    在开发一个网站的过程中各种翻页效果数不胜数,在这里我将介绍一下简单的一种方法就是使用css3的旋转即可实现这种常见的效果: 显示效果如下: 首先是页面的布局,不用那么复杂; a标签的href属性,一般 ...

  9. 如何在Crystal框架项目中内置启动MetaQ服务?

    当Crystal框架项目中需要使用消息机制,而项目规模不大.性能要求不高时,可内置启动MetaQ服务器. 分步指南 项目引入crystal-extend-metaq模块,如下: <depende ...

  10. HDU4474

    Yet Another Multiple Problem Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K ...