switch跳轉表簡析

2021-09-06 10:26:11 字數 1176 閱讀 8034

最近偶然看到一篇文章講到if else和switch case的不同,文章呼籲寫**時將所有的if else替換為switch case增強**可讀性與**效率,是否增強了**的可讀性暫且不論,思考一下為什麼能增強**效率。

了解到swtich case在流程眾多的時候,編譯器會引入跳轉表這一資料結構對彙編進行優化,而不是jmp進入每一分支進行邏輯判斷,但是我心中有個疑惑:

不論用什麼樣的資料結構都不會改變分支的判斷次數,也就是說原來判斷多少次現在還是要判斷多少次,並不會省略分支。

跳轉表是乙個陣列,表項i是乙個**段的位址,這個**段實現當開關索引值等於i時程式應該採取的動作。程式**用開關索引值來執行乙個跳轉表內的陣列引用,確定跳轉指令的目標。和使用乙個很長的if else相比,使用跳轉表的優點是執行開關語句的時間與開關情況的數量無關。gcc根據開關情況的數量和開關情況的稀疏程度來翻譯開關語句。當開關情況數量較多,並且值的跨度範圍比較小時,就會使用跳轉表。

跳轉表的原理可以簡單描述如下:

在使用switch case時,當**中case的情況較為連續時,引入跳轉表這種資料結構,對每一種case進行編號,其中case不同對應**執行不同的使用不用編號,case不同對應**執行相同的,使用相同編號,case缺失的使用同一種編號。舉例說明:

int main()

}

下面用location指代彙編中對應的**段:

case 1對應 location_a, case 2和case 4由於**執行相同,對應相同的loacation_b, case 6對應location_c, 

**中不存在的case 3和case 5對應loacation_d,大於type大於6或者小於1的對應loacation_e, (loacation_d和location_e可能相同)

按照上述處理,只要給出type,並用type減1,如果小於6,則跳轉loacation_e

(假如type - 1 < 0,對於乙個有符號的負數,gcc會將其作為無符號處理,由於有符號的負數首位為1,也大於6。)

總結:

跳轉表就是利用case的相對連續的特性對**的分支判斷進行了簡化處理。

switch跳轉表分析

file 2015 1026 exam 1 2 main.c brief switch case分析 401139h 為switch 跳轉表首位址 ecx 為 casen,casen 是作過優化的n從 0開始到4結束 在memory 視窗檢視 switch 跳轉表首位址401139h 每個位址是4個...

switch的跳轉表

1.跳轉表是否是隨機生成的?是隨機生成的 2.跳轉表的工作原理?3.跳轉表中每個case之間的關係?跳躍表的性質 1.由很多層結構組成 2.每一層都是乙個有序的鍊錶,排列順序為由高層到底層,都至少包含兩個鍊錶節點,分別是前面的head節點和後面的nil節點 3.最底層的鍊錶包含了所有的元素 4.如果...

跳躍表skiplist簡析

1.簡述 跳躍表 skiplist 最初由 william pugh發表在acm通訊上的 skip lists a probabilistic alternative to balanced trees 中,作者給出的定義是 跳表是在很多應用中有可能替代平衡樹而作為實現方法的一種資料結構。跳躍列表的...