![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
1. Никогда не думай, что ты лучше компилятора знаешь какие машинные комманды нужны - если все же лучше то пиши на асме 2. выход из "goto" все равно будет по проверке значения - так что от проверки ты не избавишься 3. в твоем примере воoбше не понятен смысл - но скорей всего ты неправильную конструкцию подобрал раз тебя терзают сомнения )) Добавлено @ 11:05 Так ?
Это сообщение отредактировал(а) mes - 25.4.2008, 11:09 |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Попробую объяснить по памяти. Есть ряд чисел: 1,2,3,2,4,5,1,4 Задача: сгруппировать одинаковые цифры таким образом, чтобы получилось: 1,1 2,2 3 4,4 5 Т.е. объединить одинаковые цифры. Внутри цикла for который выполняется 8 раз на каждую цифру приходится неизвестное количество проходов, неизвестное потому, что мы заранее не знаем какое количество совпадений будет в массиве. Т.е. берем цифру 1 и в цикле goto проходим дальше по всему массиву начиная с 2 до тех пор пока не встретится 1 (предпоследняя). |
|||
|
||||
| bsa |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Я бы тоже отказался, заменив на:
И вообще, я против goto ничего не имею, у меня самого есть код:
|
||||||||
|
|||||||||
| Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
что нет? покажи полностью небольшой пример когда контструкцию с goto *[] нельзя свести к switch/case.
зависит от оптимизатора компилятора. Некоторые вполне за О(1) перепрыгнут куда надо. Добавлено через 1 минуту и 43 секунды
причем тут goto? это простейшя задача для std::map'а или аналоигчной контсрукции
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
| SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
У меня в коде используются continue и break. Я точно не могу сказать что именно произойдет в этой ситуации, если с помощью continue/break я должен управлять циклом for, а не while:
Я логику сократил, чтобы было яснее. На самом деле там массив из неизвестного количества столбцов, если все цифры во всех столбцах совпадают со всеми цифрами в других строках, то эти строки надо объединять. При этом есть еще ряд условий, которые не позволяют объединить цифры в строках, т.к. строки имеют разные ключи. В общем тут ничем кроме как многоэтажными for'aми и if'aми не обойтись.
Соотв строки 1, 4, 6 объединяются. Это сообщение отредактировал(а) SABROG - 25.4.2008, 11:34 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Ну вот в том то и дело. Если нет чего-то типа ::continue и ::break, то получается нужен goto вместо while.
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
в том случае если состояние является константой на момент компиляции. в приведенных примерах с goto состояние определяется в рантайме
если тебе такое требуется, значит алгоритм выбран не подходяший для задачи, а вообше сложные условия решаются через состояния конечным автоматом. Это сообщение отредактировал(а) mes - 25.4.2008, 11:57 |
||||
|
|||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
по теме: больше 2х if/else наводят на мысль о switch. Кстати, switch может быть построен более эффективно, чем набор if: массив адресов перехода плюс всего одно сравнение и собственно переход. Т.е. фактически тот же jumps, что у MAKCim, только метки не изменяются. Rickert,
|
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
пипец вы развели, лучше пусть будет жрать больше времени CPU чем времени программиста, разбирающегося в этом коде.
Насчет примера выше, то что написано у Майка просматривается за 3 секунды и приходит понимание. То что написано у Максима,я не понял до сих пор. goto ухудшает восприятие кода. А уж отказываться от свитча, это по моему маразм. Если у переменной много состояний то свитч, если мало то if'ы, я так считаю. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
неа, если например case-ы - целые значения идущие по порядку, то смещение может быть вычислено вместо проверки всех условий, либо смещение берется из таблицы, либо просто вычисляется. Недаром в синтаксисе языка такие ограничения на аргумент конструкции swtch |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
А меня не наводит из-за ограничения в том, что значение которое сравниваешь должно быть константной:
Да и goto - got'e рознь. В ассемблере мне известны следующие механизмы для перехода по адресам: int'ы - прерывание retn'ы - возврат, при желании можно изменить значения в стеке, чтобы ретурны использовались вместо callов call'ы - тут все понятно, адрес возврата пихается в стек и происходит переход jmp'ы/ja/jz/jb и т.д. - аналогично call'у, разве что one way. loop'ы - условный переход, где условие - значение в регистре cx/ecx. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Никто не советует разбазаривать время CPU, но экономить пару тактов ради того чтоб запутать код определено не стоит. В программирование как в реале не стоит экономить время на не экономном. Что лучше обойти большую лужу или сэкономить две секунды и пройти насквозь? Все зависит от нескольких факторов: 1 критичность времени на данной момент 2. периметр против глубины и "чистоты" лужи 3. наличие подходящей обуви. 4 ... И если все таки решились пройти сквозь лужу надо не забывать о том что она скрываетоткрытый люк - выбраться из которого далеко не просто. )) Это сообщение отредактировал(а) mes - 25.4.2008, 12:27 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а не проще разгрузить такое большое кол-во однотипных операций - самому же дышать легче будет. к примеру так
тогда код выглядить будет примерно так
|
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |