Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [c++] исключенеия возвращающие данные из фукнции  (Прочитано 9905 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 12-09-2009 04:33 » 

[c++] исключенеия возвращающие данные из фукнции

допустим есть контейнер exc_vector, который бросает исключения при обращении к несуществующему элементу:

как может различаться по производительности код:
Код:
int d=v.size();
for(int i=0;i<d;i++) sum+=v[i];
// и
try{
 while(1) sum+=v[i++];
}
catch(range ) { }

почему обычно не используется 2й вариант кода?
Записан

1n c0de we trust
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 12-09-2009 04:35 » 

второе - некорректно, и этим всё объясняется. Зачем доводить до исключения, если можно по нормальному ?
Записан

Mayor
Специалист

ru
Offline Offline

« Ответ #2 : 12-09-2009 04:39 » 

каким местом оно не коректно?

ну хорошо, пусть будет к примеру не sum+=v[i++], а рекурсивная функция, перебирающая элементы, удовлетворяющие определенным условиям, в структуре несколько посложнее массива - рано или поздно она наткнется на не проинициализированный элемент, что будет обозначать конец поиска ...

какая принципиальная разница между проверкой каждого элемента на не корректность, которая будет означать конец функции и проброской исключения возникшего при обращении без проверки к некоректному элементу?


« Последнее редактирование: 12-09-2009 04:47 от Mayor » Записан

1n c0de we trust
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 12-09-2009 14:46 » 

моё мнение такое:

1) если класс твой, то ВСЁ корректно, если ты в описании разрешил пользователю это делать
2) если класс позволяет заранее узнать размер, не прибегая к киданию исключения, то не нужно заставлять кидать исключение. Хотя, если в доке это явно разрешается, то делай так
3) если код с блоком try-catch выполняется очень много раз, то это снизит быстродействие по сравнению с кодом без try catch

Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 12-09-2009 15:41 » 

каким местом оно не коректно?

Таким, что тебе уже давно взяться за учебнички и прежде чем сливать суперпупер генитальные идеи, сначала таки выяснить как работают исключения и какие механизмы при этом задействуются. Хоть ты читать и не любишь, но книги они несут разумное, доброе, вечное и таким образом предохраняют мозги от разжижения.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 12-09-2009 18:18 » new

как может различаться по производительности код:
Сильно. Ведь исключение бросается всякий раз, когда нужно выполнить проход по массиву. Это просто нерационально.

Цитата
почему обычно не используется 2й вариант кода?
Во-первых, из-за оверхеда.

Во-вторых, слово "исключение" как бы говорит нам, что оно генерируется в исключительной ситуации. Что такого исключительного при достижении конца массива? Это нормальная рабочая ситуация, и исключение здесь, в принципе, неуместно.
В отличие, например, от контроля за попадением в диапазон при произвольном доступе - в этом случае "непопадание" будет именно исключительной ситуацией, потому что в нормальных условиях случаться не должно (если ненормальный код, написанный ненормальным программистом, не гадает, куда ткнуться)
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #6 : 13-09-2009 14:38 » 

Вад, а разве 10к или милион проверок переменной на конец массива не перекроют на 1-2 порядка вызванный исключением оверхид?
Записан

1n c0de we trust
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 13-09-2009 14:44 » 

Если ты делаешь контейнер общего назначения (проектируешь std::vector, например) - то какие у тебя могут быть основания считать, что там будет храниться в среднем хотя бы 1000 элементов?
Ведь если контейнер будет безбожно тормозить на 10 элементах - это повод, чтобы от него отказаться. Как бы по умолчанию подразумевается, что затраты на основные операции в контейнерах должны расти линейно. А не по сложной кривой, которая к тому же зависит от внешних факторов.
« Последнее редактирование: 13-09-2009 14:47 от Вад » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 13-09-2009 15:27 » 

Mayor, кстати, смутила нотация, но
Код:
try{
 while(1) sum+=v[i++];
}
- разве в этом коде не будет производиться v.size() проверок на выход за границы массива? Ага
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 13-09-2009 16:09 » 

да size() то как раз выполнится мгновенно, имхо, поэтому можно смело делать
for(int i=0; i<v.size(); i++)
{
}
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 14-09-2009 03:21 » 

Код:
try{
 while(1) sum+=v[i++];
}
catch(range ) { }

Я медленно и спокойно, отрывают твою голову и бросаю в корзину для бумаг. Она продолжает нести какой-то бред.

Mayor, вот что за странные у тебя желания.
объясню на пальцах
1. берём стену (дерево)
2. гвоздь
3. молоток
4. бьём пока не забьём

твоё решение
1. берём стену (дерево)
2. гвоздь
3. знаменитый микроском
4. хреначим в стену пока не сломаем микроскопом или не забьём гвоздь

итог: да второй способ работает, да без сбоев, но он мягко говоря странноват.

почему не надо так делать, не смотря на то, что исключения являются способом уведомления о результатах работы
1. исключения дёшевы - пока ты их не вызываешь, вот, тогда они ОЧЕНЬ дороги
2. но главное, не очевидно поведение системы, сам себя застрелишь при поддержке этого кода

- разве в этом коде не будет производиться v.size() проверок на выход за границы массива? Ага

во-во Улыбаюсь соорудили иллюзию отсутствия проверок и еще исключение присобачили.
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines