1. ホーム
  2. c++

[解決済み] if-else文に対するswitchの優位性

2022-04-22 20:45:55

質問

を使用する際のベストプラクティスは何ですか? switch ステートメントを使用するのと if ステートメントを 30 unsigned の列挙のうち、10個程度は期待されるアクション(現在のところ同じアクション)を持っている。パフォーマンスとスペースは考慮する必要がありますが、重要ではありません。 このスニペットは抽象化されているので、命名規則で私を嫌いにならないでください。

switch ステートメントを使用します。

// numError is an error enumeration type, with 0 being the non-error case
// fire_special_event() is a stub method for the shared processing

switch (numError)
{  
  case ERROR_01 :  // intentional fall-through
  case ERROR_07 :  // intentional fall-through
  case ERROR_0A :  // intentional fall-through
  case ERROR_10 :  // intentional fall-through
  case ERROR_15 :  // intentional fall-through
  case ERROR_16 :  // intentional fall-through
  case ERROR_20 :
  {
     fire_special_event();
  }
  break;

  default:
  {
    // error codes that require no additional action
  }
  break;       
}

if ステートメントを使用します。

if ((ERROR_01 == numError)  ||
    (ERROR_07 == numError)  ||
    (ERROR_0A == numError)  || 
    (ERROR_10 == numError)  ||
    (ERROR_15 == numError)  ||
    (ERROR_16 == numError)  ||
    (ERROR_20 == numError))
{
  fire_special_event();
}

解決方法は?

スイッチを使用します。

最悪の場合、コンパイラはif-elseチェーンと同じコードを生成するので、何も失うことはありません。もし迷ったら、最も一般的なケースを最初にswitch文に入れましょう。

最良の場合、オプティマイザはコードを生成するためのより良い方法を見つけるかもしれません。コンパイラがよくやるのは、二項決定木(平均的なケースでは比較とジャンプを節約する)か、単純にジャンプテーブル(比較をまったくせずに動作する)を構築することです。