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

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

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

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

15
добавлено автор 2vision2, источник
@DCoder Я полностью согласен с тобой ..
добавлено автор 2vision2, источник
@DCoder Я полностью согласен с тобой ..
добавлено автор 2vision2, источник
добавлено автор 2vision2, источник
добавлено автор 2vision2, источник
добавлено автор 2vision2, источник
@DCoder loks интересно .. Спасибо ..
добавлено автор 2vision2, источник
@DCoder loks интересно .. Спасибо ..
добавлено автор 2vision2, источник
@PeterJ Скажите, что это gcc-компилятор? любые комментарии по этому поводу?
добавлено автор 2vision2, источник
@PeterJ Скажите, что это gcc-компилятор? любые комментарии по этому поводу?
добавлено автор 2vision2, источник
@DCoder loks интересно .. Спасибо ..
добавлено автор 2vision2, источник
Это было бы очень специфично для компилятора. Ограниченные времена, когда я смотрел на сборку ассемблера, похоже, просто используют таблицы прыжков, я никогда не видел двоичный поиск, но был бы правдоподобным для оптимизированного компилятора с достаточными аргументами case, где выражения были бы разнесены, чтобы сделать это стоящим.
добавлено автор PeterJ, источник
@ 2vision2, на самом деле, я только посмотрел на встроенный процессор. Но такой поиск имел бы только смысл редких значений, которые я никогда не видел на практике.
добавлено автор PeterJ, источник
@ 2vision2, на самом деле, я только посмотрел на встроенный процессор. Но такой поиск имел бы только смысл редких значений, которые я никогда не видел на практике.
добавлено автор PeterJ, источник
@ 2vision2, на самом деле, я только посмотрел на встроенный процессор. Но такой поиск имел бы только смысл редких значений, которые я никогда не видел на практике.
добавлено автор PeterJ, источник
@ReubenMorais не согласен с дубликатом, потому что это был Visual C ++. Если else vs switch также ответит на это: stackoverflow.com/questions/97987/… , скорее всего, ответит на это.
добавлено автор Ciro Santilli 包子露宪 六四事件 法轮功, источник
@ReubenMorais не согласен с дубликатом, потому что это был Visual C ++. Если else vs switch также ответит на это: stackoverflow.com/questions/97987/… , скорее всего, ответит на это.
добавлено автор Ciro Santilli 包子露宪 六四事件 法轮功, источник
@ReubenMorais не согласен с дубликатом, потому что это был Visual C ++. Если else vs switch также ответит на это: stackoverflow.com/questions/97987/… , скорее всего, ответит на это.
добавлено автор Ciro Santilli 包子露宪 六四事件 法轮功, источник
@ReubenMorais не согласен с дубликатом, потому что это был Visual C ++. Если else vs switch также ответит на это: stackoverflow.com/questions/97987/… , скорее всего, ответит на это.
добавлено автор Ciro Santilli 包子露宪 六四事件 法轮功, источник
Это хорошая статья, но опять же - компилятор может свободно реализовать коммутатор, но он хочет - как серию if/else, как одноуровневую или многоуровневую таблицу перехода, в виде двоичного шаблона поиска ... факт, что MSVC реализует их определенным образом, не гарантирует, что GCC, clang или ICC будут делать то же самое.
добавлено автор DCoder, источник
Это хорошая статья, но опять же - компилятор может свободно реализовать коммутатор, но он хочет - как серию if/else, как одноуровневую или многоуровневую таблицу перехода, в виде двоичного шаблона поиска ... факт, что MSVC реализует их определенным образом, не гарантирует, что GCC, clang или ICC будут делать то же самое.
добавлено автор DCoder, источник
Это хорошая статья, но опять же - компилятор может свободно реализовать коммутатор, но он хочет - как серию if/else, как одноуровневую или многоуровневую таблицу перехода, в виде двоичного шаблона поиска ... факт, что MSVC реализует их определенным образом, не гарантирует, что GCC, clang или ICC будут делать то же самое.
добавлено автор DCoder, источник
Зависит от компилятора и реальных корпусов коммутаторов. Некоторые общие реализации демонстрируются в секретах обратной инженерии .
добавлено автор DCoder, источник
Мой личный опыт работы с GCC ограничен, и я могу указать только на один интересный пример . Редактирование: конечно, если вам интересно, вы должны скомпилировать несколько разных операторов switch() и разобрать результаты.
добавлено автор DCoder, источник
Мой личный опыт работы с GCC ограничен, и я могу указать только на один интересный пример . Редактирование: конечно, если вам интересно, вы должны скомпилировать несколько разных операторов switch() и разобрать результаты.
добавлено автор DCoder, источник
Дубликат:
добавлено автор Reuben Morais, источник
Дубликат:
добавлено автор Reuben Morais, источник
Дубликат:
добавлено автор Reuben Morais, источник

8 ответы

Фактически до компилятора, как оператор 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:

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

14
добавлено
спасибо за Ваш ответ.
добавлено автор 2vision2, источник

Фактически до компилятора, как оператор 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:

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

14
добавлено
спасибо за Ваш ответ.
добавлено автор 2vision2, источник

Фактически до компилятора, как оператор 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:

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

14
добавлено
спасибо за Ваш ответ.
добавлено автор 2vision2, источник

Фактически до компилятора, как оператор 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:

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

14
добавлено
спасибо за Ваш ответ.
добавлено автор 2vision2, источник

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

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

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

8
добавлено
Спасибо за Ваш ответ.
добавлено автор 2vision2, источник

On some googling I found some interestin link and planned to post as an answer to my question. http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem

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

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

On some googling I found some interestin link and planned to post as an answer to my question. http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem

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

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

On some googling I found some interestin link and planned to post as an answer to my question. http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem

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

1
добавлено
Да, это то, что я пытался сказать - компилятор будет строить таблицы и использовать их для перехода. Но он может также использовать команды сравнения/перехода, и он будет гибридизоваться между ними, если это приведет к «лучшему» коду [все в зависимости от того, что вы определяете как лучше - кто-то может подумать, что имея 32 Кбайт таблицы для сортировки оператора switch лучше, чем четыре прыжка, потому что эти прыжки плохо предсказывают в предсказании ветвления в процессоре, но кто-то считает, что смешно иметь 32 КБ для решения этого конкретного случая]
добавлено автор Mats Petersson, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest