c語(yǔ)言switch反匯編的實(shí)現(xiàn)
在分支較多的時(shí)候,switch的效率比if高,在反匯編中我們即可看到效率高的原因
一、switch語(yǔ)句
1、在正向編碼時(shí),switch語(yǔ)句可以看做是if語(yǔ)句的簡(jiǎn)寫

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-09
C語(yǔ)言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像直方圖均衡化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
C/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-10
C++求解二叉樹的下一個(gè)結(jié)點(diǎn)問(wèn)題
本文將通過(guò)C++求解以下問(wèn)題:給定一個(gè)二叉樹其中的一個(gè)結(jié)點(diǎn),請(qǐng)找出中序遍歷順序的下一個(gè)結(jié)點(diǎn)并且返回。文中示例代碼講解詳細(xì),感興趣的可以了解一下2022-04-04
C語(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

