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

Как отчет о работе коммутатора Реализован или работает внутри страны?

Я где-то читал, что оператор switch использует "Двоичный поиск" или некоторые методы сортировки, чтобы точно выбрать правильный случай, и это увеличивает его производительность по сравнению с лестницей else-if.

А также, если мы дадим случай, чтобы коммутатор работал быстрее? это так? Можете ли вы добавить свои ценные предложения по этому поводу?

Мы обсудили здесь о том же и планировали опубликовать в качестве вопроса.

4b9b3361

Ответ 1

Фактически до компилятора, как выполняется оператор switch в коде.

Однако я понимаю, что когда он подходит (то есть относительно плотные случаи), используется таблица перехода.

Это означало бы что-то вроде:

switch(i) {
  case 0: doZero(); break;
  case 1: doOne();
  case 2: doTwo(); break;
  default: doDefault();
}

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

load i into REG
compare REG to 2
if greater, jmp to DEFAULT
compare REG to 0
if less jmp to DEFAULT
jmp to table[REG]
data table
  ZERO
  ONE
  TWO
end data
ZERO: call doZero
jmp END
ONE: call doOne
TWO: call doTwo
jmp END
DEFAULT: call doDefault
END:

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

Ответ 2

Как реализуется swtich, зависит от того, какие значения у вас есть. Для значений, близких к диапазону, компилятор обычно генерирует таблицу перехода. Если значения находятся далеко друг от друга, он будет генерировать связанную ветвь, используя что-то вроде двоичного поиска, чтобы найти правильное значение.

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

Если ничего другого, коммутатор обычно намного легче читать, чем последовательность if-else.