Подтвердить что ты не робот

На какой стадии if/else становится лучше, чем случай переключения? Имеет ли это?

Из того, что я прочитал, я могу суммировать,

  • Случай с коммутатором - это реализация, но в основном определяется как таблица перехода
  • Корпус коммутатора делает код более удобочитаемым
  • Коммутатор быстрее, чем if/elseif (?)

Рассмотрим случай, когда у меня есть 300 +. Я знаю, что if/elseif в этой сцене будет беспорядок.

Но я хочу знать, как будет выполняться случай switch такая сцена?

  • Является ли масштабируемым, если он остается относительно быстрее, чем if/else, независимо от того, сколько случаев присутствует?
  • Поскольку это реализация как я могу определить, как мой компилятор его реализует?
  • И прежде всего, как мне сделать это сравнение if/elseif - switch, кроме собственно написания кода и использования профилировщика? Я попытался скомпилировать небольшой файл .c с ключом с помощью переключателя gcc 4.8.1 -S, и это похоже на создание таблицы перехода. Где я могу перейти отсюда?
  • Лучше/хуже использовать if/elseif в таких сценариях

В первую очередь меня интересуют специфические детали C/С++.

4b9b3361

Ответ 1

Компилятор может решить использовать таблицу перехода и сделать значительное улучшение в случае 300 +.

Составители делают оптимизацию по ветвям, используя различные методы, такие как деревья решений.

Чем проще компилятор понять код, тем лучше. И инструкция switch более читаема для компилятора.

Подумайте о другом, если с точки зрения компиляторов. Это будет выглядеть как стрелка:

    - if 
     - else
      - else 
       - else
        - else

Вам нужно оценить каждый предыдущий, если для того, чтобы перейти к правильному другому.

Однако коммутатор больше похож на блок:

     - case
     - case
     - case
     - case

Поэтому компилятор может иногда определять, куда идти напрямую.

За ваши вопросы о пуле:

  • он масштабируемый. Легко писать разработчики, и если компилятор использует таблицы перехода, добавление большего числа случаев не повлияет.

  • до компилятора, чтобы решить, что использовать. Он может предпочесть не оптимизировать его вообще (но, скорее всего, таблицы перехода).

  • Возможно, вы можете запустить цикл и время опроса вручную?

  • Всегда лучше использовать переключатель. В худшем случае переключатель будет действовать так же, как if/else.

Ответ 2

Компиляторы для большинства низкоуровневых процессоров (в основном используется в Embedded Systems) не всегда генерируют таблицу перехода для случая коммутатора.

Если переменные case находятся в последовательности (например, 1,2,3,4....), то переключение таблицы реализация случая переключения предпочтительнее компилятором, но для случайной последовательности переменной случая (например, 12 344 565,1,5...) генерирует тот же код, что и сгенерированный в случае кода if-else.

Иногда из-за этого разработчики сталкиваются с трудностями при добавлении случайной переменной case в код ОК, может изменить всю реализацию этого раздела кода, что может привести к серьезному изменению времени выполнения кода и размера кода. В основном это касается встроенного разработчика.

Ответ 3

А если else лучше, чем случай переключения в случае, если у вас мало вариантов, с глубокими деревьями решений или нужно использовать неспецифическое принятие решений,

т. легко реализовать инструкцию if, которая проверяет, является ли int больше 0, что сложнее построить в оператор switch. Это тип логики, который лучше всего реализуется с использованием операторов if.

Если у вас есть плоская, очень широкая, но конкретная зависящая от условий таблица решений, тогда лучше всего использовать коммутатор. Например, вы хотите, чтобы произошли конкретные вещи, если значение равно 1, 2, 3, 4... и т.д. До 10, будет проще и безопаснее использовать корпус коммутатора.

В конце концов, современные компиляторы изменят его на то, что наиболее эффективно вычислительно, но как вы его построили, это повлияет на функциональность и поддержку после его создания.

Ответ 4

Из вопроса о сравнении коммутатора с конструкцией if..then..else, я предполагаю, что вас беспокоит ситуация, когда требуется один тест, и результат зависит от ответа (например, если x = =?? тогда...). В этом случае всегда лучше использовать переключатель: а) вы не можете ввести ошибочное условие в сторону прохождения цепи тестов. б) тест проводится только один раз.