gcc對c語言中的switch的優化

2021-08-29 11:07:20 字數 1384 閱讀 6589

在c語言中switch語句會被實現為乙個跳轉表,跳轉表是乙個陣列,這個陣列裡面存的都是位址,也就是說只要你傳遞給它乙個i,他就會返回給你,你所需要跳轉的位址,這樣做得好處就是執行語句的時間和條件的個數無關..不過在gcc裡面他也只是條件數大於4個,才會生成這個跳轉表.

請看下面的**:

[code]int switch_eg(int x)

return result;

} [/code]

這只是一段簡單的switch語句,下面我們用一段c**來描述彙編**所要做得事情.

[code]code *jt[7] = ;

int switch_eg_impl(int x)

[/code]

看上面的**就很清楚了,它會對傳進來的值與100進行乙個減法,然後再將這個值傳進switch語句.

而真實的彙編**是怎麼樣的呢,我們可以看看:

[code]switch_eg:

pushl %ebp

movl %esp, %ebp

movl 8(%ebp), %eax //這邊得到傳進來的引數

leal -100(%eax), %edx //這邊將得到的引數和100做差

cmpl $6, %edx //這邊和6比較,如果大於6說明下面的條件沒有滿足的所以預設進入default

jbe .l11

.l2:

popl %ebp

xorl %eax, %eax

ret.p2align 4,,7

.l11:

jmp *.l7(,%edx,4) //這邊也就是我們上面偽碼所描述的那個jt[xi]

.section .rodata

.align 4

.align 4

.l7: //這邊就是所構造的跳轉表.

.long .l3

.long .l2

.long .l4

.long .l5

.long .l6

.long .l2

.long .l6

.text

.l6: // loc_d

imull %eax, %eax

popl %ebp

.p2align 4,,6

ret.l5: //loc_c

popl %ebp

movl $114, %eax

.p2align 4,,6

ret.l4: //loc_b

popl %ebp

movl $123, %eax

.p2align 4,,4

ret.l3: //loc_a

popl %ebp

movl $1300, %eax

.p2align 4,,4

ret[/code]

C語言中switch語句

在多分支選擇中,用if語句程式會冗長,可讀性低,用switch更合適。switch語句格式 switch 表示式 注意 1 當 表示式 與 各個常量 都不匹配時執行default後的語句n,也是可有 可無 2 switch後面括號裡的 表示式 的值為整型或字元型 3 若沒有default時,swit...

C語言中的switch詳解

switch語句 c語言中實現多分支選擇的語句 例 輸入乙個分數等級,輸出對應分數 switch grade 注 switch 括號中值的型別是整型 包括字元型 grade在這兒是字元型別。case標號只起乙個標記的作用,沒有條件檢查的功能,程式執行時,根據switch 中的值,找到與其相同的cas...

C 語言中switch模組case default

package flowcontrol 1.2.publicclass switchcase 15.16.17.last default 18.publicstaticvoid testlast int i 29.30.31.middle default 32.publicstaticvoid te...