切换语句与IF ELSE IF语句在C ++中的比较

时间:2012-04-25 15:47:55

标签: switch-statement case if-statement

我有技术想知道这里的人,切换语句执行得更快,我知道的事情

但我想知道的是它的表现如何比和&否则如果?

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

如果我认为它是使用if else编写的,如果它自己运行并找到合适的情况,那么它不应该执行得更快,它会执行相同的if if if?

你能回答我吗?提前谢谢

1 个答案:

答案 0 :(得分:4)

switch语句基本上针对每种情况执行相同类型的比较:var == avar == bvar == c等。

This page has details of how that's translated into assembly by a compiler,但基本上有三种“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整数 - 如果有一个重要数字,一些编译器会为所有情况构建一个二叉搜索树,所以您有O(log(n))时间执行任何特定分支,这应该可以提高代码的性能。 (重要取决于您正在编译的体系结构,因为检查应该遵循树的哪个分支或者现在应该跳转会产生额外的开销。)
  4. 这种情况下你可能会超越编译器,有时候:如果你知道你的情况只能用某个等式匹配,比如3x+5,那么你可以构建一个函数指针数组,计算索引( (caseNum - 5) / 3),然后执行它Continuation-Passing Style(或者如果你想让人们开车,做同样的计算并建立一个goto标签数组,然后跳上意大利面风格。无论哪种方式您将获得具有O(1)分支时间的最佳“连续案例”式程序集。