C/C++零散知识点汇总之switch实现原理&switch和if-else对比
switch...case一般写法:
switch (表达式) { case data1 : 语句1 break; case data2 : 语句1 break; case data3 : 语句1 break; case data4 : 语句1 break; ... default : 语句n break; }
if...else一般写法:
if (boolean) { 代码块 } else if (boolean) { 代码块 } else if (boolean) { 代码块 } else { 代码块 }
switch...case实现原理
通俗的说,先把内存中switch里面的case值按照顺序生成一个表,当没有那个值时,它对应的就是default。
具体来讲,switch...case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于最大case常量,若大于,则调到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址 + 表项大小 * 索引号),程序接着跳到此地址执行,到此完成了分支的跳转。
由此看来,switch是通过以空间换时间的思想实现。
if...else实现原理
if...else是通过遍历查找的方式来进行分支跳转。执行效率很低。
switch...case和if...else对比
1、分支较多时,当使用switch的效率是很高的,因为switch是随机访问的,就是当确定了选择值之后直接跳转到特定的分支,但是if...else是遍历所有的可能值,直到找到符合条件的分支。由此看来switch的效率确实比if...else要高得多。
2、相对来说switch占用的代码空间更多,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch...case的空间使用率较低。
3、switch...case只能处理case为常量的情况,对于非常量的情况是无能为力的。例如if (a > 1 && a < 100),是无法使用switch...case来处理的,所以switch...case只能在常量选择分支时比if...else高效,但是if...else能用于更多的场合,if...else相对更灵活。
4、switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化。
5、switch只将表达式计算一次,然后将表达式的值与每个case的值进行比较,进而选择执行哪个分支的语句块。
6、if-else的判断条件范围更广,每天语句基本上是独立的,每次判断时都要加载条件一次,所以在多路分支时使用switch比if...else结构要更高效。
7、if...else语句每一句都是独立的,if条件中的左值要被读入寄存器多次,右值分别被读入寄存器一次。当虚拟机读到switch的时候所有的判断数据都加载到了内存中,而if是边判断边加载。