Unity優化 我所理解的IL指令

2022-07-09 07:18:14 字數 2322 閱讀 7121

指令格式

英文單詞全寫

指令解釋

nopno 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)中,所以在返回時,不用關心之前壓入引數佔據堆疊單元的問題?】

retreturn

從當前函式返回,並且將返回值從當前函式的計算堆疊推送到呼叫者函式的計算堆疊

newobj ctor

new object constructor

建立乙個新引用型別或者值型別物件例項,並將建立出來的引用壓入計算堆疊,並呼叫其後面跟隨的ctor建構函式。如果當前建立的是值型別物件,那麼它壓入當前堆疊的是記憶體位址位於當前堆疊上的物件引用。當應用於引用型別時,此方法會產生gcalloc。

需要注意以下幾點:

所有的物件型別繼承自system.object類,所有的值型別繼承自system.valuetype類。

不是所有的newobj 指令都會產生新的gc alloc。當它應用值型別時,就會在當前計算堆疊上構建object,而不需要存放至堆。

不是所有的new a() **,都會被翻譯成il中的newobj指令。當a是物件型別時,一定轉換成newobj;當a時值型別時,就有可能轉換成newobj,也有可能轉換成initobj,取決於是否需要執行建構函式。

box指令,即裝箱指令,是將值型別封裝成物件型別的乙個過程。必然產生新的gc alloc。

我所理解的前端

轉眼間,在鵝廠的實習已經過去三個多月,涉及到實習生轉正留用的考核流程也逐步開始了。帶著一堆疑問,以及自己實習期間的心得體會,與導師暢談了一番。他作為資深前端工程師,就前端領域及我個人未來的職業規劃等方面分享了他自己的經驗。這次與導師的溝通讓我受益匪淺,現簡單總結如下。前端知識學習路線 首先,當然是就...

我所理解的陣列

陣列 一 一維陣列 1 陣列的建立 陣列顧名思義是含有相同元素的集合,類似我們高中數學所學習的集合 例如int arr 10 char arr1 2 float arr2 3 double arr3 5 注意 切記 這個中要給常量,不能使用變數。2 陣列的初始化 初始化是指 在陣列的建立同時並賦予合...

我所理解的OpenSocial

昨天在google參加了opensocial的講座,通過三位opensocial工程師的精彩演講,我對這個東西有了一些簡單的理解。下面就把我所理解的opensocial,也算是筆記整理在這裡。1 為什麼會有opensocial?當前社會是乙個網路的社會,當前的網路是乙個社會性的網路,sns遍地開花到...