【C语言】switch的实现 && switch与if-else的执行效率比较

(一)switch的实现原理

通俗的说,先在内存中把swich里面的case值按照顺序排一个表,当没有那个值时,它对应的就是default.

具体地说,switch...case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。

由此看来,switch是以空间换时间的。

(二)switch与if-else的执行效率比较

  1. 当分支较多时,当时用switch的效率是很高的。因为switch是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if-else是遍历所以得可能值,知道找到符合条件的分支。如此看来,switch的效率确实比if-else要高的多。
  2. 由上面的汇编代码可知道,switch-case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch-case的空间利用率将变得很低。
  3. switch-case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch-case来处理的。所以,switch只能是在常量选择分支时比if-else效率高,但是if-else能应用于更多的场合,if-else比较灵活。
  4. switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化。
  5. switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选择执行哪一个case的语句块。
  6. if-else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载一次。所以在多路分支时用switch比if-else结构要效率高。
  7. if-else语句每一句是独立的。if条件中的左值要被读入寄存器多次,右值分别被读入寄存器一次。当虚拟机读到switch的时候将所有的判断数据都加载在内存中了,而if是边判断边加载所以就慢一些。

一般如果判断数据不多,而且是byte,short,int或是char类型的时候一般用switch,那样效率比较高。

 

你可能感兴趣的:(C语言)