Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
В 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 должна содержать, вызываемая функция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 16:46 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Владимир2012Ну а если скажем case будет 30 штук, то для доступа к 29 по счету case, компилятор должен произвести 29 операций сравнения. За современные компиляторы не скажу, а 20 лет назад они генерировали таблицу переходов, так что switch работал вообще без сравнения. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 17:00 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Сложно себе представить рукотворный switch из 30 вариантов выхода. Возможно это был побочный продукт какого-нибудь Бизона. Кроме того на задачу можно посмотреть под другим углом. Сама анализируемая сущность в switch может иметь полиморфизм в методах и тогда задача решается по другому. Оператор варианта вообще уходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 17:04 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Сомневаюсь что оптимизаторы в компиляторах компилируют как в коде написано. Если интересно - затести скорость выполнения case 1 и case 30. Массив возможен если значения в case близкие, например 1,2,3. Но если 1,500,100500 то массив 100500 элементов получится. Наверно есть другие решения, бинарное дерево и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 17:07 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
maytonСложно себе представить рукотворный switch из 30 вариантов выхода. Обработка ошибок. Обработка сообщений, например оконные сообщения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 17:14 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Вот думаю для каких еще алгоритмических случаев можно было применить данный подход? PS: Может быть этот подход можно каким либо образом усовершенствовать? Например вместо индекса передавать ссылку на структуру, которая помимо индекса содержала дополнительные данные .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 17:22 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Dima TМассив возможен если значения в case близкие, например 1,2,3. Но если 1,500,100500 то массив 100500 элементов получится. Ну а зачем в качестве индекса передавать значение скажем равное 1500000? Думаю здесь проблемы нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 17:29 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
maytonСложно себе представить рукотворный switch из 30 вариантов выхода. Возможно это был побочный продукт какого-нибудь Бизона. Любое классическое Windows-приложение будет иметь и больше вариантов в switch. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 17:34 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Вот подумал как например этот подход применить например к обработки оконных сообщений? Похоже в этом случаем array должен содержать не только адреса переходов, но и код message. Ну а адрес для перехода ищем в array например бинарным способом ... PS: Вообще то хорошо бы эту идею обсудить и по результату написать или faq или можем быть даже воплотить разные варианты замены switch в виде какой-либо library ... Может возьмется кто? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 17:50 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Владимир2012воплотить разные варианты замены switch в виде какой-либо library ...шаблоны проектирования Стратегия и Состояние отлично умеют заменять все эти switch одной красивой строчкой кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 17:54 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
egorychшаблоны проектирования Стратегия и Состояние отлично умеют заменять все эти switch одной красивой строчкой кода С ними не знаком. Так как вам они известны, то вот и вопрос. То что они одной строчкой решают вопрос это хорошо, но а как обстоит вопрос с их эффективностью по сравнению с предложенным способом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 17:58 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Владимир2012Dima TМассив возможен если значения в case близкие, например 1,2,3. Но если 1,500,100500 то массив 100500 элементов получится. Ну а зачем в качестве индекса передавать значение скажем равное 1500000? Думаю здесь проблемы нет. Коды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто. About Messages and Message Queues https://msdn.microsoft.com/en-us/library/windows/desktop/ff381405(v=vs.85).aspx ... Message-identifier values are used as follows: The system reserves message-identifier values in the range 0x0000 through 0x03FF (the value of WM_USER – 1) for system-defined messages. Applications cannot use these values for private messages. Values in the range 0x0400 (the value of WM_USER) through 0x7FFF are available for message identifiers for private window classes. If your application is marked version 4.0, you can use message-identifier values in the range 0x8000 (WM_APP) through 0xBFFF for private messages. The system returns a message identifier in the range 0xC000 through 0xFFFF when an application calls the RegisterWindowMessage function to register a message. The message identifier returned by this function is guaranteed to be unique throughout the system. Use of this function prevents conflicts that can arise if other applications use the same message identifier for different purposes. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:08 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Владимир2012Вот подумал как например этот подход применить например к обработки оконных сообщений? Похоже в этом случаем array должен содержать не только адреса переходов, но и код message. Ну а адрес для перехода ищем в array например бинарным способом ... PS: Вообще то хорошо бы эту идею обсудить и по результату написать или faq или можем быть даже воплотить разные варианты замены switch в виде какой-либо library ... Может возьмется кто? Тут нечего ни обсуждать, ни воплощать, всё уже украдено до нас. Бери например MFC и читай код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:10 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Владимир2012 wrote: >>С ними не знаком. рекомендую ознакомиться, а то ты их сейчас изобретаешь ))) Стратегия , Состояние , прошу любить и жаловать )) >>а как обстоит вопрос с их эффективностью по сравнению с предложенным способом? вызов виртуальной функции, по сути - это тоже самое, что ты предлагаешь, только из коробки, потому что таблицу виртуальных функций за тебя построит компилятор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:10 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Я так понимаю что это пятница. Ну что-ж. Начнём. Можно запилить хеш-табличку... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:12 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Dima TКоды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто. Так выше в messages вроде мной приведен подход к обработке кодов например оконных сообщений ... По идее он будет более эффективным чем череда case. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:14 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
egorychвызов виртуальной функции, по сути - это тоже самое, что ты предлагаешь Да нет. Переход по адресу виртуальной функции это тот же самый case ... Во время run-time переход к виртуальной функции производится поиском в таблице нужной ... PS: Конечно неплохо было бы потестить Стратегия, Состояние и предложенный подход в плане производительности. Ну а если скажем какая либо функция содержит swith в цикле. Как по мне предложенный подход оптимизирует цикл /в части использования switch/ ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:24 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Владимир2012Dima TКоды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто. Так выше в messages вроде мной приведен подход к обработке кодов например оконных сообщений ... По идее он будет более эффективным чем череда case. Он не будет более эффективен, чем case, поскольку case оптимизируется компиляторами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:30 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Владимир2012egorychвызов виртуальной функции, по сути - это тоже самое, что ты предлагаешь Да нет. Переход по адресу виртуальной функции это тот же самый case ... Во время run-time переход к виртуальной функции производится поиском в таблице нужной ... Нет, это косвенный вызов. Никаких поисков там нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:30 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
egorychрекомендую ознакомиться, а то ты их сейчас изобретаешь ))) Стратегия , Состояние , прошу любить и жаловать )) Без обид ... "Шоб у тебя в программе было 15 шаблонов Стратегия и 30 шаблонов Состояние ..." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:33 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
MasterZivОн не будет более эффективен, чем case, поскольку case оптимизируется компиляторами. Расскажи как ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:35 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Владимир2012Dima TКоды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто. Так выше в messages вроде мной приведен подход к обработке кодов например оконных сообщений ... По идее он будет более эффективным чем череда case. Ты про бинарный поиск? Его при компиляции можно реализовать. по сути switch() выраждается в конструкцию типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. строка типа Код: plaintext 1. компилируется в одну команду процессора, если не путаю, может в две. при большом количестве переходов можно превратить в бинарное дерево, типа такого Код: plaintext 1. 2. 3. 4. 5. 6. причем это будет эффективнее чем обычный бинарный поиск. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:47 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Dima T++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:49 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Владимир2012"Шоб у тебя в программе было 15 шаблонов Стратегия и 30 шаблонов Состояние ..."уверяю тебя, что это лучше, чем иметь 45 свичей для тех же целей. Хотя... если платят за строчку кода, то подход со свичами - самый подходящий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 18:49 |
|
||
|
Аналог switch, но более эффективный
|
|||
|---|---|---|---|
|
#18+
Dima Tпри большом количестве переходов можно превратить в бинарное дерево, типа такого Код: plaintext 1. 2. 3. 4. 5. 6. Как вариант ... Еще один на мой взгляд довод в полезность предложенного подхода. Переход к участку кода путем выборки адреса перехода + выполнения оператора goto сам по себе "минималичен" ..., а вот обвязка к решению этого вопроса с использованием классов и виртуальных функций безусловно потребует больших накладных расходов ... PS: Ну что Dima может проверишь? Ты у нас самый работящий, а мы ленивые только сидим с попкорном и читаем твои posts ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2015, 19:18 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38960181&tid=2018778]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
75ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 274ms |
| total: | 453ms |

| 0 / 0 |
