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

明確なものが必要です。

1 つbreakにつき 1つであるcaseため、あいまいさが軽減されます。

breaka 内の if-else 内に複数埋もれているのは、そのうちの 1 つが省略されたswitch場合の災害のレシピです。break

于 2011-02-02T17:56:36.530 に答える
0

可能であれば、switchステートメントをお勧めします

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

     . . .
     default:
        //TODO
  }

長い間、elseステートメントの場合、これはより高速になります...

于 2011-02-02T16:51:41.500 に答える