c語(yǔ)言switch反匯編的實(shí)現(xiàn)
在分支較多的時(shí)候,switch的效率比if高,在反匯編中我們即可看到效率高的原因
一、switch語(yǔ)句
1、在正向編碼時(shí),switch語(yǔ)句可以看做是if語(yǔ)句的簡(jiǎn)寫(xiě)
2、break在switch語(yǔ)句的妙用
1、當(dāng)switch存在3個(gè)分支時(shí)
當(dāng)去掉break的時(shí)候
二、switch語(yǔ)句的反匯編
1、當(dāng)switch存在3個(gè)分支時(shí)
#include<stdio.h> void Function(int x) { switch (x) { case 1: printf("1"); case 2: printf("2"); case 3: printf("3"); default: printf("4"); } } int main() { Function(2); return 0; }
可以看出,此時(shí)switch的反匯編代碼與if語(yǔ)句無(wú)異。
當(dāng)有四個(gè)if語(yǔ)句的時(shí)候就會(huì)生成大表。
2、當(dāng)switch語(yǔ)句出現(xiàn)四個(gè)分支時(shí),編譯器會(huì)產(chǎn)生大表
步驟:
1、將傳進(jìn)來(lái)的數(shù)先減去1,再進(jìn)行比較。判斷出該參數(shù)是否超過(guò)switch語(yǔ)句中最大常量還,即判斷參數(shù)是直接進(jìn)入default中還是進(jìn)入case中
2、 若參數(shù)<=max,則用寄存器保留該值。并代入表達(dá)式中,通過(guò)大表直接跳到相應(yīng)的地址
注意
分支少于四個(gè),則switch無(wú)意義,編譯器會(huì)按if…else…語(yǔ)句進(jìn)行反匯編
case后的常量的順序不影響大表的生成
將常量值的順序打亂,觀察反匯編代碼
正向代碼
匯編代碼
這里可以看到大表里面都是自己排好序了。
將連續(xù)的10項(xiàng)中抹去1項(xiàng)或者2項(xiàng),觀察反匯編有無(wú)變化
正向代碼是這樣的
這里可以看到有幾個(gè)地址是一樣的
可以發(fā)現(xiàn)是指向默認(rèn)的地址。
3、當(dāng)switch存在多個(gè)分支,常量連續(xù)性相對(duì)不高時(shí)
就會(huì)生成小表
步驟:
1、將傳進(jìn)來(lái)的參數(shù)減去最小值,然后跟最大值相比,如果大于的話就跳到默認(rèn)的地方,不然就用差值去查小表,然后查大表。
補(bǔ)充:當(dāng)case后的常量差距較大時(shí)
編譯器按照if…else…進(jìn)行反匯編
到此這篇關(guān)于c語(yǔ)言switch反匯編的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c語(yǔ)言switch反匯編內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Cocos2d-x Schedule定時(shí)器的使用實(shí)例
這篇文章主要介紹了Cocos2d-x Schedule定時(shí)器的使用實(shí)例,本文的講解內(nèi)容包含在代碼注釋中,需要的朋友可以參考下2014-09-09C語(yǔ)言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像直方圖均衡化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10C/C++開(kāi)發(fā)中extern的一些使用注意事項(xiàng)
這篇文章主要為大家介紹了C/C++開(kāi)發(fā)中extern一些使用注意事項(xiàng)的事例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01通過(guò)“回文字算法”復(fù)習(xí)C++語(yǔ)言
這篇文章主要介紹了通過(guò)“回文字算法”復(fù)習(xí)C++語(yǔ)言的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10C++求解二叉樹(shù)的下一個(gè)結(jié)點(diǎn)問(wèn)題
本文將通過(guò)C++求解以下問(wèn)題:給定一個(gè)二叉樹(shù)其中的一個(gè)結(jié)點(diǎn),請(qǐng)找出中序遍歷順序的下一個(gè)結(jié)點(diǎn)并且返回。文中示例代碼講解詳細(xì),感興趣的可以了解一下2022-04-04C語(yǔ)言 fseek(f,0,SEEK_SET)函數(shù)案例詳解
這篇文章主要介紹了C語(yǔ)言 fseek(f,0,SEEK_SET)函數(shù)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08