Аналог switch, но более эффективный
Владимир2012
Дата: 15.05.2015 16:46:51
В switch ( expression ) expression должно быть:
"The expression must be of an integral type or of a class type for which there is an unambiguous conversion to integral type".
Если switch содержит несколько case /от 2 до 4/, то проблем нет.
Ну а если скажем case будет 30 штук, то для доступа к 29 по счету case, компилятор должен произвести 29 операций сравнения.
Ниже предлагается один из вариантов решения этой проблемы.
И так программа в качестве expression должна передавать номер индекса к какому-либо array, содержащему адреса точек
перехода для оператора goto.
Все!
Notes: Конечно array должна содержать, вызываемая функция.
Dimitry Sibiryakov
Дата: 15.05.2015 17:00:01
Владимир2012 |
---|
Ну а если скажем case будет 30 штук, то для доступа к 29 по счету case, компилятор должен произвести 29 операций сравнения. |
За современные компиляторы не скажу, а 20 лет назад они генерировали таблицу переходов,
так что switch работал вообще без сравнения.
Posted via ActualForum NNTP Server 1.5
mayton
Дата: 15.05.2015 17:04:27
Сложно себе представить рукотворный switch из 30 вариантов выхода. Возможно это был побочный
продукт какого-нибудь Бизона.
Кроме того на задачу можно посмотреть под другим углом. Сама анализируемая сущность в switch
может иметь полиморфизм в методах и тогда задача решается по другому. Оператор варианта вообще уходит.
Dima T
Дата: 15.05.2015 17:07:43
Сомневаюсь что оптимизаторы в компиляторах компилируют как в коде написано. Если интересно - затести скорость выполнения case 1 и case 30.
Массив возможен если значения в case близкие, например 1,2,3. Но если 1,500,100500 то массив 100500 элементов получится. Наверно есть другие решения, бинарное дерево и т.п.
Dima T
Дата: 15.05.2015 17:14:41
mayton |
---|
Сложно себе представить рукотворный switch из 30 вариантов выхода. |
Обработка ошибок. Обработка сообщений, например оконные сообщения.
Владимир2012
Дата: 15.05.2015 17:22:55
Вот думаю для каких еще алгоритмических случаев можно было применить данный подход?
PS: Может быть этот подход можно каким либо образом усовершенствовать?
Например вместо индекса передавать ссылку на структуру, которая помимо индекса содержала
дополнительные данные ....
Владимир2012
Дата: 15.05.2015 17:29:11
Dima T |
---|
Массив возможен если значения в case близкие, например 1,2,3. Но если 1,500,100500 то массив 100500 элементов получится. |
Ну а зачем в качестве индекса передавать значение скажем равное 1500000?
Думаю здесь проблемы нет.
MasterZiv
Дата: 15.05.2015 17:34:32
mayton |
---|
Сложно себе представить рукотворный switch из 30 вариантов выхода. Возможно это был побочный продукт какого-нибудь Бизона. |
Любое классическое Windows-приложение будет иметь и больше вариантов в switch.
Владимир2012
Дата: 15.05.2015 17:50:46
Вот подумал как например этот подход применить например к обработки оконных сообщений?
Похоже в этом случаем array должен содержать не только адреса переходов, но и код message.
Ну а адрес для перехода ищем в array например бинарным способом ...
PS: Вообще то хорошо бы эту идею обсудить и по результату написать или faq или можем быть
даже воплотить разные варианты замены switch в виде какой-либо library ...
Может возьмется кто?
egorych
Дата: 15.05.2015 17:54:23
Владимир2012 |
---|
воплотить разные варианты замены switch в виде какой-либо library ... |
шаблоны проектирования Стратегия и Состояние отлично умеют заменять все эти switch одной красивой строчкой кода.