版权声明:本文为博主原创文章,欢迎转载。请保留博主链接: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. Hao Yin Jian 寒假第一周

    题目链接:https://vjudge.net/contest/147561#problem/A 题意:除法运算,abcde / fghij = n,从小到大输出,其中abcdefghij为0~9的不 ...

  2. ML_note1

    Supervised Learning In supervised learning, we are given a data set and already know what our correc ...

  3. 如何在Eclipse中配置python开发环境

    考虑到网上关于Eclipse中配置Python开发环境的文章千篇一律,故写此文以总结. 本文主要内容是:三种Pydev配置方法和一种PyDev卸载方法. 本文的前提是你已经安装了Eclipse和pyt ...

  4. leetcode[149]Max Points on a Line

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  5. Cracking the code interview

    推荐一本书<Cracking the code interview> Now in the 5th edition, Cracking the Coding Interview gives ...

  6. Java泛型的类型擦除

    package com.srie.testjava; import java.util.ArrayList; import java.util.List; public class TestGener ...

  7. iOS 多线程NSThread理解与场景示例

    NSThread是相对GCD和NSOperationQuene而言,比较轻量级的一种多线程处理方式. 但同时,它的弊端就是需要自己管理线程的生命周期,以及线程同步:而另外两种不需要自己管理. 常见方法 ...

  8. Vmware 中安装 Ubuntu Server (或者ubuntu 以文本界面登陆时) 分辨率无法全屏问题

    Vmware 中安装 Ubuntu Server/Ubuntu 分辨率,无法全屏问题 需要更改grub设置 在终端或者文本界面按下列步骤进行设置: 第一步: 输入命令 sudo vim /etc/de ...

  9. ROM、RAM、DRAM、SRAM和FLASH的区别

    ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ...

  10. Brainfuck与Ook!编程语言解析与解密

    MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...