Более быстрый способ проверки длинного регистра с помощью ||условия - PullRequest
0 голосов
/ 05 марта 2019

У меня есть заявление о переключении с 5 случаями.Один из этих 5 случаев выглядит следующим образом:

switch (Number)
   {
   case 1:
      CallSomeFunction1();
      break;
   case 3:
      CallSomeFunction3();
      break;
   case 4:
      CallSomeFunction4();
      break;
   case (2 || 7 || 8 || 9 || 12 || 14 || 18 || 19 || 22 || 23 || 25):
      CallSomeFunction();
      break;
   case 6:
      CallSomeFunction6();
      break;
  }

Случай переключения выполняется в системе реального времени каждые 10 мс.Что будет (или есть ли) самый быстрый способ проверить это утверждение?

1 Ответ

0 голосов
/ 05 марта 2019

Код, который вы предоставляете, не должен компилироваться: (2 || 7 || 8 || 9 || 12 || 14 || 18 || 19 || 22 || 23 || 25) равен 1 в C, и это дублирующая метка регистра.

Компилятор оптимизирует исправленные

case 2: case 7: case 8: ... case 25:
    CallSomeFunction();
    break;

с помощьюзамечательное мастерство (возможно, с таблицей прыжков ).Проверьте сгенерированный код сборки, если у вас есть какие-либо сомнения.Вероятно, это будет быстрее, чем использование массива указателей функций, настроенных так, что вы могли бы написать SomeFunctions[Number]();.

Любой из этих подходов, вероятно, будет быстрее, чем написание функции, которая преобразует 2, 7, 8, ..., 25 к константному выражению.

В вашем случае вы могли бы написать

default:
    CallSomeFunction();
...