Постановка удаленных файлов

Это небольшое упрощение, как обычно, любой современный компилятор, который встречает последовательность if..else if .., которая может быть тривиально преобразована в оператор switch человеком, компилятор также будет. Но просто для того, чтобы добавить дополнительную забаву, компилятор не ограничен синтаксисом, поэтому он может генерировать «переключающие», подобные заявления внутри, которые имеют сочетание диапазонов, одиночных целей и т. Д., И они могут (и делать) делать это как для коммутатора, так и для. .else.

Anyhoo, расширение ответа Konrad заключается в том, что компилятор может генерировать таблицу переходов, но это не обязательно гарантировано (и не желательно). По множеству причин таблицы переходов приводят плохие вещи к предсказателям отрасли на современных процессорах, а сами таблицы плохо работают с кэшем, например.

switch(a) { case 0: ...; break; case 1: ...; break; }

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

433
задан Nick Volynkin 24 June 2015 в 07:26
поделиться