Вопрос по if-statement, switch-statement, gcc, c++, c – Как Switch case Statement Реализован или работает внутри?

19

Я где-то читал, чтоswitch заявление используетБинарный поиск » или некоторые методы сортировки, чтобы точно выбрать правильный случай, и это увеличивает его производительность по сравнению с другими.

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

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

Дубликат:stackoverflow.com/questions/2596320/... Reuben Morais
Зависит от компилятора и реальных случаев переключения. Некоторые общие реализации продемонстрированы вСекреты обратного инжиниринга. DCoder
@ReubenMorais не согласен с дубликатом, потому что это специфично для Visual C ++. Если еще против коммутатора, вероятно, ответит также:stackoverflow.com/questions/97987/... скорее всего ответит и на это. Ciro Santilli 新疆改造中心996ICU六四事件

Ваш Ответ

3   ответа
9

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

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

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

Спасибо за Ваш ответ. 2vision2
16

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:

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

спасибо за Ваш ответ. 2vision2
1

ть в качестве ответа на мой вопрос.http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem

Комментарии приветствуются ..

Да, этоВроде того, что я пытался сказать - компилятор будет строить таблицы и использовать их для перехода. Но он также может использовать операторы сравнения / перехода и будет гибридизироваться между ними, если это приведет к "лучше" код [все в зависимости от того, что вы определяете как лучше - кто-то может подумать, что наличие 32 КБ таблицы для сортировки оператора switch лучше, чем четыре перехода, потому что эти переходы плохо предсказать в предсказании ветвления в процессоре, но кто-то другой думает этосмешно иметь 32KB для решения этого конкретного случая] Mats Petersson

Похожие вопросы