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)文章
利用C語(yǔ)言實(shí)現(xiàn)順序表的實(shí)例操作
順序表是線性表中的一種重要的數(shù)據(jù)結(jié)構(gòu),也是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),所以他不僅是學(xué)習(xí)中的重點(diǎn),也是應(yīng)用開(kāi)發(fā)非常常用的一種數(shù)據(jù)結(jié)構(gòu)。這篇文章介紹如何利用C語(yǔ)言實(shí)現(xiàn)順序表。2016-08-08
C++進(jìn)程的創(chuàng)建和進(jìn)程ID標(biāo)識(shí)詳細(xì)介紹
傳統(tǒng)的C++(C++98)中并沒(méi)有引入線程這個(gè)概念。linux和unix操作系統(tǒng)的設(shè)計(jì)采用的是多進(jìn)程,進(jìn)程間的通信十分方便,同時(shí)進(jìn)程之間互相有著獨(dú)立的空間,不會(huì)污染其他進(jìn)程的數(shù)據(jù),天然的隔離性給程序的穩(wěn)定性帶來(lái)了很大的保障2022-08-08
C++中產(chǎn)生臨時(shí)對(duì)象的情況及其解決方案
這篇文章主要介紹了C++中產(chǎn)生臨時(shí)對(duì)象的情況及其解決方案,以值傳遞的方式給函數(shù)傳參,類型轉(zhuǎn)換以及函數(shù)需要返回對(duì)象時(shí),并給對(duì)應(yīng)給出了詳細(xì)的解決方案,通過(guò)圖文結(jié)合的方式講解的非常詳細(xì),需要的朋友可以參考下2024-05-05
C++?list常用接口和模擬實(shí)現(xiàn)實(shí)例代碼
C++中l(wèi)ist容器底層實(shí)現(xiàn)是使用帶頭雙向循環(huán)鏈表的結(jié)構(gòu),通過(guò)指針指向前一個(gè)和后一個(gè)節(jié)點(diǎn),它也具有雙向鏈表的優(yōu)缺點(diǎn),下面給大家介紹C++?list常用接口和模擬實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧2025-04-04
C++面試八股文之STL標(biāo)準(zhǔn)模板庫(kù)使用詳解
這篇文章主要為大家介紹了C++面試八股文之STL標(biāo)準(zhǔn)模板庫(kù)使用詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Qt實(shí)現(xiàn)模糊匹配功能的實(shí)例詳解
對(duì)于瀏覽器的使用,我想大家一定不會(huì)陌生吧,輸入要搜索的內(nèi)容時(shí),會(huì)出現(xiàn)相應(yīng)的匹配信息。本文就來(lái)用Qt實(shí)現(xiàn)模糊匹配功能,感興趣的可以了解一下2022-10-10
C++實(shí)現(xiàn)簡(jiǎn)易圖書館管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)易圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

