Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2012, 13:01   #1
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
Стрелка Case vs If in C - минимультивопрос

Всем привет. =) И снова я. Итак:

1. У оператора Case есть ограничения по количеству кэйзов? Т.е. он выдержит конструкцию из 700-та с лишним(а может и 2000 с лишним) вариантов выбора?
2. Что шустрее работает - куча(те же самые 2000) If-ов(да, пусть ещё в конце каждого if сделать "goto propusk_vseh_ostalnih_ifov", чтоб не плодить else-ы) или точно такой же большой Case? (так то нужно добиться скорости в несколько микросекунд... или около того... но это уже не суть)

*чтоб не спрашивали лишний раз для чего мне это - речь о микроконтроллере, энкодере и 2к+ его положениях, при каждом из которых контроллер отсылает в "импровизированнуюминисеть" определённую команду... кстати, отсюда ещё вопрос - выдержит ли контроллер(ATMega16) столько кода внутри себя?... но это уже вопрос тестирования ;( ...*
Я вредный и нервный, но бдобр.
Karp_13 вне форума Ответить с цитированием
Старый 14.04.2012, 13:06   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)выдержит.
2)считаю что в вашем случае лучше case.
*если памяти(я не знаю размера вашей программы) хватит то выдержит, почему нет то?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.04.2012, 13:13   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Белая магия компилятора может превратить свитч в хитрую структуру данных, наподобие map
Где ключ - это значение case, а значение по ключу - указатель на функцию, которая запустит блок case на выполнение.

Таким образом, в боевом коде свитч не будет пошагово проверять каждое значение case, а сразу прыгнет на функцию-блок нужного case.

Точная конструкция этой хитрой структуры зависит от компилятора с его оптимизациями.
Одно можно сказать совершенно наверняка:

В целом, конструкции типа:
Код:
int val = 100500;
if (val == 1) { ... }
if (val == 2) { ... }
...
if (val == 100500) { ... }
Компилятору оптимизировать сложнее, чем свитч с аналогичной логикой.
Поэтому, можно считать, что switсh в среднем работает быстрее, за счет того, что потенциально лучше может быть оптимизирован.

Но вообще есть нюансы. Например, если конкретный блок отработавшего case не break`неццо, то сам блок switсh не закончит свою работу, а будит продолжаться поиск уже нового претендента case

Поэтому, независимо от того, во что блок switсh превратит белая магия компилятора, но на уровне самого исходного кода порядок следования case важен. Он определяет логику работы самого блока switсh.
_Bers вне форума Ответить с цитированием
Старый 14.04.2012, 13:22   #4
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
По умолчанию

Щас вроде прога, если память не подводит(на руках её нет, на работе лежит), занимает всего около 20% памяти... так что тоже думаю должен выдержать(в том плане, что должно поместиться).

Мгм, понятно. Ок, спасибище. Развеяли мои хмурые ранне весенние мысли!))))

ps:
А кстати, пока я не убежал - глупый вопрос в догонку... Где то слышал, что использование goto в коде вообще подрывает любые работы по оптимизации... так вот если у меня в начале кода и кое где в конце есть goto(ну люблю я goto и всё)) - это критично скажется на оптимизации моего многодетного Case-а, который лежит где то в середине?... просто может кто сталкивался с подобным, мне гуглить щас лень =3 ))))
Я вредный и нервный, но бдобр.

Последний раз редактировалось Karp_13; 14.04.2012 в 13:38.
Karp_13 вне форума Ответить с цитированием
Старый 14.04.2012, 17:24   #5
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
Где то слышал, что использование goto в коде вообще подрывает любые работы по оптимизации... так вот если у меня в начале кода и кое где в конце есть goto(ну люблю я goto и всё)) - это критично скажется на оптимизации моего многодетного Case-а, который лежит где то в середине?.
Не скажеться, ты его уже оптимизировал, использовав GOTO. Я его, кстати, тоже использую. Бывает очень удобно разом завершить три а то и четыре вложенных цикла.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
case от а до я Horus92 Помощь студентам 7 15.07.2010 01:43
Use case elenSV Помощь студентам 0 09.06.2010 22:28
Case of Lemo Помощь студентам 4 06.06.2010 01:12
Case Is nes@ Помощь студентам 0 18.11.2009 20:21