【Unity優(yōu)化】我所理解的IL指令

指令格式 英文單詞全寫 指令解釋
nop no operation performed 不做任何操作址貌,留待后續(xù)版本補(bǔ)齊此操作碼功能
ldc.i4 num load const 將操作常數(shù)數(shù)num推送到計(jì)算堆棧.
其中i4代表int32常數(shù),棧頂結(jié)果為int32;
ldc.i8欺旧,代表推送int64常數(shù),結(jié)果為int64;
ldc.i4.s偿曙,代表推送int8悠瞬,結(jié)果為int32;
ldc.i4.m1昵骤,代表推送-1(minus 1),結(jié)果為int32;
ldc.r4交惯,代表推送float32次泽,結(jié)果為float32;
ldc.r8,代表推送float64商玫,結(jié)果為float64;
ldloc n load local 加載第n個(gè)本地變量到計(jì)算堆棧;
ldloc.n牡借,n取0~3拳昌,代表加載n處的本地變量;
ldloc.s n,短格式钠龙,針對(duì)0~255之間數(shù)值炬藤,更高效;
ldloca index load local 加載第n個(gè)本地變量的地址到計(jì)算堆棧;
ldloca.s 短格式
stloc.n stack local 彈出計(jì)算堆棧上的棧頂元素碴里,存儲(chǔ)到本地變量列表(即調(diào)用堆棧)的第n個(gè)位置沈矿,即賦值給第n個(gè)局部變量(函數(shù)參數(shù)也被編譯為局部變量)
box valTypeToken box 裝箱,將值類型封裝成valTypeToken指定的對(duì)象類型咬腋,流程是羹膳,彈出計(jì)算堆棧上的值類型參數(shù),并使用新建立的一個(gè)引用類型對(duì)象進(jìn)行并包裝根竿,將包裝結(jié)果返回計(jì)算堆棧陵像。本過(guò)程產(chǎn)生GC Alloc就珠。
unbox valType unbox 拆箱,將引用類型轉(zhuǎn)換成相應(yīng)值類型valType醒颖,流程是妻怎,彈出計(jì)算堆棧上的引用類型參數(shù),并執(zhí)行拆箱轉(zhuǎn)換泞歉,將轉(zhuǎn)換完成的值類型結(jié)果推送回計(jì)算堆棧
unbox.any typeTok unbox any 拆箱逼侦,將引用類型轉(zhuǎn)換成相應(yīng)值類型或者引用類型typeTok,流程與unbox相同腰耙,差別是榛丢,如果typeTok是值類型,則與unbox相同沟优;如果typeTok是引用類型涕滋,則與castclass相同,即執(zhí)行類型轉(zhuǎn)換
castclass classT cast class 強(qiáng)制類型轉(zhuǎn)換挠阁,流程是宾肺,將計(jì)算堆棧上的參數(shù)彈出,并驗(yàn)證其是否是繼承了classT指定的class侵俗,或者實(shí)現(xiàn)于classT指定的接口锨用,如果不是,則引發(fā)轉(zhuǎn)換異常隘谣;如果轉(zhuǎn)換正常增拥,則把轉(zhuǎn)換后的結(jié)果引用返回;如果當(dāng)前的參數(shù)本身是null寻歧,則也返回null
initobj typeTok init object 將當(dāng)前計(jì)算堆棧棧頂單元視為某個(gè)值類型對(duì)象的地址掌栅,調(diào)用值類型typeTok的初始化方法,將此地址指向的值類型單元置為0码泛,與newobj指令不同 猾封,initobj不調(diào)用構(gòu)造函數(shù)方法。
call methodDesc call method description 應(yīng)用于早綁定的函數(shù)調(diào)用噪珊,即它不會(huì)考慮函數(shù)重載晌缘。在函數(shù)調(diào)用之前,傳遞的參數(shù)應(yīng)該已經(jīng)被壓到計(jì)算堆棧上痢站,此時(shí)執(zhí)行call指令磷箕,執(zhí)行完成之后,將會(huì)執(zhí)行ret指令阵难,并將返回值存儲(chǔ)到計(jì)算堆棧岳枷。
callvirt method call method 應(yīng)用于晚綁定的函數(shù)調(diào)用,即它會(huì)計(jì)算函數(shù)重載。除此之外嫩舟,其運(yùn)行步驟與call相同氢烘。【每個(gè)函數(shù)調(diào)用起始家厌,都會(huì)有2句話max stack ...;.locals init(...)播玖,是否是由它們彈出當(dāng)前計(jì)算堆棧上的參數(shù),并存放到當(dāng)前的局部變量列表(Call Stack)中饭于,所以在返回時(shí)蜀踏,不用關(guān)心之前壓入?yún)?shù)占據(jù)堆棧單元的問(wèn)題?】
ret return 從當(dāng)前函數(shù)返回掰吕,并且將返回值從當(dāng)前函數(shù)的計(jì)算堆棧推送到調(diào)用者函數(shù)的計(jì)算堆棧
newobj ctor new object constructor 創(chuàng)建一個(gè)新引用類型或者值類型對(duì)象實(shí)例果覆,并將創(chuàng)建出來(lái)的引用壓入計(jì)算堆棧,并調(diào)用其后面跟隨的ctor構(gòu)造函數(shù)殖熟。如果當(dāng)前創(chuàng)建的是值類型對(duì)象局待,那么它壓入當(dāng)前堆棧的是內(nèi)存地址位于當(dāng)前堆棧上的對(duì)象引用。當(dāng)應(yīng)用于引用類型時(shí)菱属,此方法會(huì)產(chǎn)生GCAlloc钳榨。

需要注意以下幾點(diǎn):

  1. 所有的對(duì)象類型繼承自System.Object類,所有的值類型繼承自System.ValueType類纽门。
  2. 不是所有的newobj 指令都會(huì)產(chǎn)生新的GC Alloc薛耻。當(dāng)它應(yīng)用值類型時(shí),就會(huì)在當(dāng)前計(jì)算堆棧上構(gòu)建Object赏陵,而不需要存放至堆饼齿。
  3. 不是所有的new A() 代碼,都會(huì)被翻譯成IL中的newobj指令蝙搔。當(dāng)A是對(duì)象類型時(shí)缕溉,一定轉(zhuǎn)換成newobj;當(dāng)A時(shí)值類型時(shí)吃型,就有可能轉(zhuǎn)換成newobj证鸥,也有可能轉(zhuǎn)換成initobj,取決于是否需要執(zhí)行構(gòu)造函數(shù)败玉。
  4. box指令敌土,即裝箱指令镜硕,是將值類型封裝成對(duì)象類型的一個(gè)過(guò)程运翼。必然產(chǎn)生新的GC Alloc。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兴枯,一起剝皮案震驚了整個(gè)濱河市血淌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖悠夯,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌淮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沦补,警方通過(guò)查閱死者的電腦和手機(jī)乳蓄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)夕膀,“玉大人虚倒,你說(shuō)我怎么就攤上這事〔瑁” “怎么了魂奥?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)易猫。 經(jīng)常有香客問(wèn)我耻煤,道長(zhǎng),這世上最難降的妖魔是什么准颓? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任哈蝇,我火速辦了婚禮,結(jié)果婚禮上瞬场,老公的妹妹穿的比我還像新娘买鸽。我一直安慰自己,他們只是感情好贯被,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布眼五。 她就那樣靜靜地躺著,像睡著了一般彤灶。 火紅的嫁衣襯著肌膚如雪看幼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天幌陕,我揣著相機(jī)與錄音诵姜,去河邊找鬼。 笑死搏熄,一個(gè)胖子當(dāng)著我的面吹牛棚唆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播心例,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼宵凌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了止后?” 一聲冷哼從身側(cè)響起瞎惫,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溜腐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瓜喇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挺益,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年乘寒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了望众。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伞辛,死狀恐怖黍檩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情始锚,我是刑警寧澤刽酱,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站瞧捌,受9級(jí)特大地震影響棵里,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姐呐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一殿怜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曙砂,春花似錦头谜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至笑陈,卻和暖如春际度,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涵妥。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工乖菱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓬网。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓窒所,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親帆锋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吵取,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法窟坐,內(nèi)部類的語(yǔ)法海渊,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法哲鸳,線程的語(yǔ)...
    子非魚_t_閱讀 31,581評(píng)論 18 399
  • 在 Java 中臣疑,內(nèi)存的分配是由程序完成的,而內(nèi)存的釋放則是由 Garbage Collecation(GC) 完...
    Shawn_Dut閱讀 5,866評(píng)論 3 28
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理徙菠,服務(wù)發(fā)現(xiàn)讯沈,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,125評(píng)論 29 470
  • 你好挤茄!明天! 努力就好冰木,沒努力就不好穷劈!
    8b7dfb65e7b3閱讀 138評(píng)論 0 0