C/C++零散知识点汇总之switch实现原理&switch和if-else对比
  qrJHiMhufrJ3 2023年11月13日 15 0


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是边判断边加载。

 

 

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
qrJHiMhufrJ3
最新推荐 更多