关于switch case和if else的效率问题

刚刚看完老师的C++教程,讲的是switch语句的用法。

中间内容就不提了,毕竟不是本文重点,不过说实话老师讲的还真不错。

到结尾部分。

老师提起了 switch case 和 if else 的效率问题。

老师的理解是 switch case 内部就是 if else 来完成的,只是编译器帮你将 switch 代码转换成了 if 。

因为在讲解 switch 中间呢,提及了一个知识,case只是一个标签。

通过下断可以看到 switch 的执行流程 并没有在 case 行停顿。

也就是说 在switch执行时,是直接跳到 相匹配的 case 标签后的代码。并没有像 if else 一样 逐一匹配条件。

(语言表达能力较差)

当时我个人想了下,因为这些年 一直在玩易语言,对程序执行 有一定的感觉了。(类似于学英语时间长了的那种语感)

既然,在调试下断模式下,switch没有在 case 行停顿,但是 程序却能准确的跳到匹配的条件后。

应该是在调试编译时,生成了一种类似于map 地图的一种东西。因为 case 只能是常量 不能为变量。

所以理解成 生成了一种 map 地图 不为过。

在编译时,这种map 就直接放在文件中,而不是运行时的内存中。

如果switch是通过这种map来走向case后的条件。那么认定 switch case 比 if else 的效率要高 这种说法也合理。

(语言表达能力真的很差)

在看完这节课后。我又去百度查了一下。发现我的这种“感觉”并没有错。



        switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。

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

        由此看来,switch有点以空间换时间的意思,而事实上也的确如此。

(引用自:https://blog.csdn.net/kehui123/article/details/5298337)



        switch在判断分支时,没有判断所有的可能性,而是用一个静态表来解决这个问题,所以速度要比if-else快。 

但是,switch对较复杂的表达式进行判断,所以当我们需要判断一些简单数值时,用switch较好。

(引用自:https://blog.csdn.net/spy19881201/article/details/5851792)



        swith的实现机制不是就是if else吗?

        当然不是,在多条件下,if ...else...语句要从上至下一个一个的比较,但是switch可以直接命中。如果楼主懂汇编代码的话可以去看下编译后的汇编代码,在多条件下生成的汇编代码是完全不一样的,if语句生成的代码会根据条件的增加而增加,所以多条件下switch会更快,但是switch也有不好的地方,比如支持的类型没有if灵活。

(引用自:https://zhidao.baidu.com/question/487773680.html



以上资料,足以证明老师的观点确实有误。

虽然 switch 在效率上比 if 略胜一筹,但是 switch 的局限性却比 if 大。

比如在判断一个 范围的时候 switch 这种静态的“判断”方式,就已经限制了他的条件类型,常量。

所以,在真正的运用时,if 还是要比 switch 常用且实用一些。

(当然,更适合使用 switch 的时候,肯定用 switch 啦)


语言表达能力真的真的真的很差,所以特别啰嗦,刚开始写博客不久,望读者海涵。


如引用的内容造成侵权等情况,请私信联系删除。谢谢。

如文章内容有误处,欢迎评论指出。谢谢。

猜你喜欢

转载自blog.csdn.net/u012088909/article/details/80073161