C ++中的SWITCH语句与IF ELSE IF语句

3 if-statement case switch-statement

我在这里想知道技术人员,switch语句执行得更快,我知道

但是我想知道的是,与if&else if相比,它的执行速度如何更快?

如何直接在所有案例中找到controlExpression合适的案例?

如果我假设它是使用if编写的,如果它可以自行运行并找到合适的情况,那么它不应该执行得更快,它的执行效果与if if是否相同?

那你能回答我吗?提前致谢

小智 5

一个switch声明基本执行相同的排序为每一种情况下比较:var == avar == bvar == c等。

本页详细介绍了如何通过编译器将其转换为汇编语言,但是本质上有三种“种类”的switch语句:

  1. switch具有连续case整数的语句 -如case 3: ... case 4: ... case 5: ...。在这些情况下,编译器可以创建一个跳转表-跳转到连续内存块中的地址列表,然后只需计算偏移量,找到地址并跳转即可。这可能比if-else if类型链更快。(当然,只有一种情况会稍微慢一些。)
  2. switch带有看似随机case整数的语句 -例如case 12: ... case 106: ... case 9: ...。在这种情况下,编译器将只构建一个if-else if链,因此它不会比if-else if代码类型更快。
  3. switch带有看似随机case整数的LOTS语句 -如果存在大量数字,则某些编译器将为所有情况构建一个二进制搜索树,因此您有O(log(n))时间执行任何特定分支,这将提高代码的性能。(重要取决于您正在编译的体系结构,因为检查树的哪个分支或现在是否应该跳转会产生额外的开销。)

在这种情况下,有时您可能会比编译器更聪明:如果您知道您的案例只能被某些方程式(例如)匹配3x+5,那么您可以构建一个函数指针数组,计算索引((caseNum - 5) / 3),然后执行它Continuation-通过样式(或者,如果您想让人们发脾气,请进行相同的计算并构建一个goto标签数组,然后跳转意大利面样式。无论哪种方式,您都将获得具有O(1)分支时间的最佳“连续案例”样式的程序集。