Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аналог switch, но более эффективный / 25 сообщений из 115, страница 1 из 5
15.05.2015, 16:46
    #38960072
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
В 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 должна содержать, вызываемая функция.
...
Рейтинг: 0 / 0
15.05.2015, 17:00
    #38960090
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Владимир2012Ну а если скажем case будет 30 штук, то для доступа к 29 по счету case,
компилятор должен произвести 29 операций сравнения.
За современные компиляторы не скажу, а 20 лет назад они генерировали таблицу переходов,
так что switch работал вообще без сравнения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.05.2015, 17:04
    #38960102
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Сложно себе представить рукотворный switch из 30 вариантов выхода. Возможно это был побочный
продукт какого-нибудь Бизона.

Кроме того на задачу можно посмотреть под другим углом. Сама анализируемая сущность в switch
может иметь полиморфизм в методах и тогда задача решается по другому. Оператор варианта вообще уходит.
...
Рейтинг: 0 / 0
15.05.2015, 17:07
    #38960106
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Сомневаюсь что оптимизаторы в компиляторах компилируют как в коде написано. Если интересно - затести скорость выполнения case 1 и case 30.

Массив возможен если значения в case близкие, например 1,2,3. Но если 1,500,100500 то массив 100500 элементов получится. Наверно есть другие решения, бинарное дерево и т.п.
...
Рейтинг: 0 / 0
15.05.2015, 17:14
    #38960111
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
maytonСложно себе представить рукотворный switch из 30 вариантов выхода.
Обработка ошибок. Обработка сообщений, например оконные сообщения.
...
Рейтинг: 0 / 0
15.05.2015, 17:22
    #38960125
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Вот думаю для каких еще алгоритмических случаев можно было применить данный подход?

PS: Может быть этот подход можно каким либо образом усовершенствовать?
Например вместо индекса передавать ссылку на структуру, которая помимо индекса содержала
дополнительные данные ....
...
Рейтинг: 0 / 0
15.05.2015, 17:29
    #38960132
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Dima TМассив возможен если значения в case близкие, например 1,2,3. Но если 1,500,100500 то массив 100500 элементов получится.
Ну а зачем в качестве индекса передавать значение скажем равное 1500000?
Думаю здесь проблемы нет.
...
Рейтинг: 0 / 0
15.05.2015, 17:34
    #38960142
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
maytonСложно себе представить рукотворный switch из 30 вариантов выхода. Возможно это был побочный
продукт какого-нибудь Бизона.

Любое классическое Windows-приложение будет иметь и больше вариантов в switch.
...
Рейтинг: 0 / 0
15.05.2015, 17:50
    #38960163
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Вот подумал как например этот подход применить например к обработки оконных сообщений?
Похоже в этом случаем array должен содержать не только адреса переходов, но и код message.
Ну а адрес для перехода ищем в array например бинарным способом ...

PS: Вообще то хорошо бы эту идею обсудить и по результату написать или faq или можем быть
даже воплотить разные варианты замены switch в виде какой-либо library ...
Может возьмется кто?
...
Рейтинг: 0 / 0
15.05.2015, 17:54
    #38960168
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Владимир2012воплотить разные варианты замены switch в виде какой-либо library ...шаблоны проектирования Стратегия и Состояние отлично умеют заменять все эти switch одной красивой строчкой кода.
...
Рейтинг: 0 / 0
15.05.2015, 17:58
    #38960181
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
egorychшаблоны проектирования Стратегия и Состояние отлично умеют заменять все эти switch одной красивой строчкой кода
С ними не знаком.
Так как вам они известны, то вот и вопрос.
То что они одной строчкой решают вопрос это хорошо, но а как обстоит вопрос с их
эффективностью по сравнению с предложенным способом?
...
Рейтинг: 0 / 0
15.05.2015, 18:08
    #38960197
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Владимир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.
...
Рейтинг: 0 / 0
15.05.2015, 18:10
    #38960199
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Владимир2012Вот подумал как например этот подход применить например к обработки оконных сообщений?
Похоже в этом случаем array должен содержать не только адреса переходов, но и код message.
Ну а адрес для перехода ищем в array например бинарным способом ...

PS: Вообще то хорошо бы эту идею обсудить и по результату написать или faq или можем быть
даже воплотить разные варианты замены switch в виде какой-либо library ...
Может возьмется кто?

Тут нечего ни обсуждать, ни воплощать, всё уже украдено до нас.
Бери например MFC и читай код.
...
Рейтинг: 0 / 0
15.05.2015, 18:10
    #38960204
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Владимир2012 wrote:
>>С ними не знаком.
рекомендую ознакомиться, а то ты их сейчас изобретаешь ))) Стратегия , Состояние , прошу любить и жаловать ))

>>а как обстоит вопрос с их эффективностью по сравнению с предложенным способом?
вызов виртуальной функции, по сути - это тоже самое, что ты предлагаешь, только из коробки, потому что таблицу виртуальных функций за тебя построит компилятор.
...
Рейтинг: 0 / 0
15.05.2015, 18:12
    #38960206
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Я так понимаю что это пятница.

Ну что-ж. Начнём. Можно запилить хеш-табличку...
...
Рейтинг: 0 / 0
15.05.2015, 18:14
    #38960210
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Dima TКоды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто.
Так выше в messages вроде мной приведен подход к обработке кодов например оконных сообщений ...
По идее он будет более эффективным чем череда case.
...
Рейтинг: 0 / 0
15.05.2015, 18:24
    #38960225
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
egorychвызов виртуальной функции, по сути - это тоже самое, что ты предлагаешь
Да нет. Переход по адресу виртуальной функции это тот же самый case ...
Во время run-time переход к виртуальной функции производится поиском в таблице нужной ...

PS: Конечно неплохо было бы потестить Стратегия, Состояние и предложенный подход в
плане производительности.

Ну а если скажем какая либо функция содержит swith в цикле.
Как по мне предложенный подход оптимизирует цикл /в части использования switch/ ...
...
Рейтинг: 0 / 0
15.05.2015, 18:30
    #38960233
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Владимир2012Dima TКоды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто.
Так выше в messages вроде мной приведен подход к обработке кодов например оконных сообщений ...
По идее он будет более эффективным чем череда case.

Он не будет более эффективен, чем case, поскольку case оптимизируется компиляторами.
...
Рейтинг: 0 / 0
15.05.2015, 18:30
    #38960234
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Владимир2012egorychвызов виртуальной функции, по сути - это тоже самое, что ты предлагаешь
Да нет. Переход по адресу виртуальной функции это тот же самый case ...
Во время run-time переход к виртуальной функции производится поиском в таблице нужной ...


Нет, это косвенный вызов. Никаких поисков там нет.
...
Рейтинг: 0 / 0
15.05.2015, 18:33
    #38960235
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
egorychрекомендую ознакомиться, а то ты их сейчас изобретаешь ))) Стратегия , Состояние , прошу любить и жаловать ))
Без обид ...

"Шоб у тебя в программе было 15 шаблонов Стратегия и 30 шаблонов Состояние ..."
...
Рейтинг: 0 / 0
15.05.2015, 18:35
    #38960238
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
MasterZivОн не будет более эффективен, чем case, поскольку case оптимизируется компиляторами.
Расскажи как ...
...
Рейтинг: 0 / 0
15.05.2015, 18:47
    #38960244
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Владимир2012Dima TКоды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто.
Так выше в messages вроде мной приведен подход к обработке кодов например оконных сообщений ...
По идее он будет более эффективным чем череда case.
Ты про бинарный поиск? Его при компиляции можно реализовать.

по сути switch() выраждается в конструкцию типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if(val == 1) goto m1;
if(val == 100) goto m100;
if(val == 500) goto m500;
if(val == 100500) goto m100500;
goto mdefault;
m1: ...; goto end;
m100: ...; goto end;
m500: ...; goto end;
m100500: ...; goto end;
mdefault: ...; goto end;
end: ...


строка типа
Код: plaintext
1.
if(val == 500) goto m500;


компилируется в одну команду процессора, если не путаю, может в две.
при большом количестве переходов можно превратить в бинарное дерево, типа такого
Код: plaintext
1.
2.
3.
4.
5.
6.
if(val <= 100) {
  if(val == 1) goto m1;
  if(val == 100) goto m100;
} else {
  if(val == 500) goto m500;
  ...


причем это будет эффективнее чем обычный бинарный поиск.
...
Рейтинг: 0 / 0
15.05.2015, 18:49
    #38960245
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Dima T++
...
Рейтинг: 0 / 0
15.05.2015, 18:49
    #38960246
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Владимир2012"Шоб у тебя в программе было 15 шаблонов Стратегия и 30 шаблонов Состояние ..."уверяю тебя, что это лучше, чем иметь 45 свичей для тех же целей.
Хотя... если платят за строчку кода, то подход со свичами - самый подходящий
...
Рейтинг: 0 / 0
15.05.2015, 19:18
    #38960261
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог switch, но более эффективный
Dima Tпри большом количестве переходов можно превратить в бинарное дерево, типа такого
Код: plaintext
1.
2.
3.
4.
5.
6.
if(val <= 100) {
  if(val == 1) goto m1;
  if(val == 100) goto m100;
} else {
  if(val == 500) goto m500;
  ...


Как вариант ...

Еще один на мой взгляд довод в полезность предложенного подхода.
Переход к участку кода путем выборки адреса перехода + выполнения оператора goto сам по себе
"минималичен" ..., а вот обвязка к решению этого вопроса с использованием классов и виртуальных
функций безусловно потребует больших накладных расходов ...

PS: Ну что Dima может проверишь?
Ты у нас самый работящий, а мы ленивые только сидим с попкорном и читаем твои posts ...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аналог switch, но более эффективный / 25 сообщений из 115, страница 1 из 5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]