2017-02-09 12 views
6

Как оператор switch сразу же попадает в нужное место в памяти? С вложенными if-операторами он должен выполнять сравнения с каждым из них, но с помощью оператора switch он переходит непосредственно в правильный случай. Как это реализовано?Как работает оператор смены

+6

У вашего компилятора, вероятно, есть флаг, чтобы показать вам код сборки, который он сгенерировал ... Спойлер: часто это примерно так же, как куча if-s –

+1

Что заставляет вас думать, что это так? И 'if' не так ли? Просьба указать ссылку на стандарт, подтверждающий ваше утверждение. – Olaf

+0

@DavidConnolly: не могли бы вы принять ответ? – chqrlie

ответ

15

Существует множество различных способов составления инструкции switch в машинный код. Вот некоторые из них:

  • компилятор может произвести серию тестов, которая не является настолько неэффективной, так как только о журнале (N) испытания достаточно, чтобы послать значение среди N возможно случаев.

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

  • Если значения case достаточно плотные, компилятор может создать таблицу адресов перехода и код, который проверяет, находится ли значение переключателя в диапазоне, охватывающем все значения, и перепрыгивает непосредственно на соответствующий адрес. Это, вероятно, ближайшая к вашему описанию реализация: , но с оператором switch она идет непосредственно в нужный случай.

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

Дизайнеры-компиляторы прилагают много усилий, пытаясь улучшить эвристику для этих вариантов. Посмотрите на сборку или используйте онлайн-инструмент, такой как Godbolt's Compiler Explorer, чтобы увидеть различные возможности генерации кода.