switch
① 當判斷條件小于4時switch的匯編代碼
Snipaste_2019-10-30_15-36-04.png
switch少量判斷.png
② 當條件大于4時switch執(zhí)行default的匯編代碼(我傳入的參數是5,switch會執(zhí)行default)
switch4.png
switch-default.png
-
我們看一下ida給我們分析的(ida更加詳細的給出了代碼的執(zhí)行順序以及打印信息)
switchDefaultIDA.png
③ 當條件大于3時switch執(zhí)行中間判斷的匯編代碼(我傳入的參數是2)
switch-noDefault.png
switch-noDefault1.png
Snipaste_2019-11-04_12-49-31.png
switch_table.png
$總結: 當判斷條件大于3的時候,代碼的執(zhí)行先判斷是否執(zhí)行default,然后再根據算法算出對應的值.(相當于生成了一個表,程序根據算法去查詢表格,取出對應的值)
④對于連貫的switch判斷(case1, 2, 3...)對應的有相應的算法,那對于不連貫的判斷是否是單個的比較還是有對應的算法呢,下邊我們看對于不連貫的的判斷,看匯編代碼是否一樣?
switch_001.png
switch002.png
switch003.png
switch004.png
$總結: 當判斷條件不連貫且中間判斷條件相隔不大時,還是會執(zhí)行算法,對于中間缺失的判斷,內存中會用指向default的內存地址填充.我們無法控制是否讓編譯器執(zhí)行判斷語句或者是算法運算,編譯器會在效率或者內存上進行取舍.
總結:
- switch語句分支較少的時候(小于4),沒必要用switch...case語句,相當于if...else判斷.
- 各個分支常量差值較大時,編譯器會在效率或者內存上進行取舍.就相當于if...else判斷.
- 在分支較多時(大于3)且分支常量差值較小的情況下,在編譯的時候會生成一個表(跳轉表每個地址4個字節(jié)).