3

以下控制流选项之一是否有效率偏好以用于循环或切换另一个?

选项1:

switch(...){
    case 1:
        if (...) { ... }
        else if (...) { ... }
        else if (...) { ... }
        .
        .
        .
        else if (...) { ... }
        break;
    case 2:
    .
    .
    .
}

选项 2:

switch(...){
    case 1:
        if (...) { ... break; }
        if (...) { ... break; }
        .
        .
        .
        if (...) { ... break; }
    case 2:
    .
    .
    .
}
4

5 回答 5

4

不会。任何理智的编译器都会生成相同的输出(程序集、字节码等)。对彼此而言。

gcc -S您可以使用为两个版本生成程序集来演示这一点。

于 2011-02-02T16:45:09.433 回答
1

您可以在特定的特定情况下仔细检查汇编输出以确定,但我希望任何现代编译器在大多数情况下都会生成相同的代码。

但是,为了便于阅读,我更喜欢第一种形式,因为 if/else if/else 块链更清楚地向我表明(至少)这些选项是互斥的,而一系列不相交的 if 语句对我来说意味着选项可能不是相互排斥的。但这只是我对风格的主观判断。

于 2011-02-02T16:48:46.140 回答
1

我想从技术上讲option 1是为了空间和option 2速度,但是任何现代编译器都可能会优化差异,即使没有,差异也可能很小。除非您处于一个严格限制的环境中,其中每个字节或指令周期都很重要,并且您的编译器非常简单,否则从长远来看,您可能会更好地避免微优化和代码的可读性和可维护性。

于 2011-02-02T16:49:36.853 回答
1

你需要一些明确的东西。

break每个case减少歧义 。

当其中一个' 被省略时,多个break埋在 if-else 内部switch是一个灾难的秘诀。break

于 2011-02-02T17:56:36.530 回答
0

如果可能的话,我会推荐 switch 语句

  switch (expr) {
     case c1:
        //TODO
        break;
     case c2: 
        //TODO
        break;

     . . .
     default:
        //TODO
  }

长长的 if else 语句,这会更快......

于 2011-02-02T16:51:41.500 回答