![]() |
|
Модераторы: Daevaorn |
![]()
|
|
||
|
|
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Добрый день,
Допустим мы пишем функцию-член, в которой происходит трансформация вектора из строк.
Эта функция не гарантирует строгой безопасности, так-как если вдруг оператор + класса string для 4-ого объекта в векторе сгенерирует исключение, то первые три будут модифицированы, и класс изменит свое состояние. Исправить это легко
но этот вариант намного медленнее. Если отбросить те моменты, где строгая безопасность исключений явно необходима, то в остальных случаях код подобного рода смахивает на паранойю. Скажем оператор + может сгенерировать bad_alloc, в принципе в этом случае вообще можно наплевать на то, что случиться с программой, все равно продолжать работать в таком состоянии будет невозможно, тут главное помереть с достоинством. В общем вопрос в том, стоит ли стараться давать строгую гарантию безопасности исключений за счет производительности, в тех случаях, когда этого явно не требуется. И в каких вообще случаях стоит это делать? Спасибо. Добавлено через 1 минуту и 57 секунд Забыл сказать, я за вариант "Только когда это явно требуется". |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а если таk, то ненамного :
Это сообщение отредактировал(а) mes - 9.9.2010, 09:09 |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
специально дожидался этого времени ? поддерживаю. в данном случае ( std::bind2nd(std::plus<std::string>(), "A") ) это действительно похоже на параною, а вот если там будет, например, вызов функции из dll-ки плагина, то это - вполне оправдано. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
borisbn
Речь не только про исключение bad_alloc. Есть категория исключений, с которыми в большинстве случаев вообще не знаешь что делать. bad_alloc - хороший пример из этой категории. Вопрос на самом деле немного более запутанный. Углубимся в детали допустим мы разрабатываем класс X, который будет проделывать некоторую работу. Класс будет использован нами и возможно в дальнейшем еще кем-то другим, из своей же компании. Поскольку безопасность исключений нельзя оставлять на потом (это может затронуть интерфейс класса) об этом надо подумать заранее. Функция transform нас вполне устраивает и базовой гарантии нам более чем достаточно в нашем конкретном случае, но кто знает в каком контексте будет использован класс Х другими программистами? А если то, что сегодня кажется паранойей завтра кому-то другому может понадобиться? Смысл в том, думать ли о будущем, жертвовать производительностью программы, если на данный момент это не нужно? Немного изменим пример, сделаем класс X шаблонным. Теперь в него можно передавать любой тип, и то, что кажется паранойей (исключение из оператора +) для класса string может запросто стать обычным явлением в каком нибудь классе A, хотя на сегодняшний день использование класса X с таким типом не предполагается. Но если посмотреть для примера библиотеку STL она для большинства классов дает строгую гарантию безопасности исключений, для большинства, но не для всех и скорее всего из соображений производительности. Это сообщение отредактировал(а) azesmcar - 9.9.2010, 10:49 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
azesmcar, обычно, это решается путем указания в документации всех известных подводных камней. Т.е. в твоем случае, ты можешь указать, что в случае возникновения исключения класс окажется в неизвестном состоянии. Поэтому использующий его хороший программист будет это уже иметь в виду.
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Свой вариант - нужно обеспечить, что бы при возникновении исключения не происходило утечек ресурсов и класс (откуда оно вышло) остался в consistent состоянии (т.е. не развалился при его дальнейшем использовании). Отслеживать, что бы класс остался в ПРАВИЛЬНОМ состоянии не требуется, т.к. совершенно непонятно, что под этим ПРАВИЛЬНОМ состоянием понимать.
Т.е. если возьмем исходный пример -
Если этот метод отработает до конца (без исключений), data в любом случае будет модифицирован. И нет никакого смысла при возникновении исключения где то посередине работы все откатывать в первоначальное состояние. Исключение в принципе сигнализирует об ошибке где то в процессе выполнения, и изменение части массива data можно считать частью этой возникшей ошибки |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Думаю, это сделано не для того, чтобы гарантировать тебе безопасность, а просто так получилось при проектировании (т.е. оптимальный алгоритм это гарантирует, а другие - менее эффективны, поэтому не рассматриваются). Или просто необходимо, так как возможное "неизвестное состояние" может привести к краху программы. |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
xvr
Это базовая гарантия, это само собой как минимум. http://en.wikipedia.org/wiki/Exception_guarantees
тема про "strong guarantee". в документации естественно это должно указываться |
||||
|
|||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
Я обычно стараюсь избегать таких ограждений. Только если отдаю на модификацию какие-то важные данные, которые могут понадобиться даже после того, как программа начала умирать. В целом это очень редко, так что ответ между "по требованию" и "никогда!", но ближе к "никогда".
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В таком случае будет вариант 2, плавно перетекающий в вариант 3, т.к. лично я не очень вижу массы мест (точнее вообще их не вижу |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
azesmcar, ты же не маленький, ты сам все понимаешь, что мы подразумеваем под "basic", а что под "strong". Естественно, мьютексы и железки надо возвращать в исходное состояние. Более того, тут скорее всего никакого оверхеда по производительности не возникает (только немного по коду). А вот то, о чем ты говорил в первом посте (strong), это уже совсем другое - это значительный оверхед. Более того, местами совершенно ненужный. Поэтому, пользователь твоего класса узнав, что ему предоставляется только basic, уже сам должен решать как поступать дальше - добавлять код для получения strong или нет. Твоя задача, не ставить преграды на его пути (т.е. сделать все необходимое, чтобы он мог воспользоваться стандартной схемой: создать копию, изменить ее, сделать swap с оригиналом)...
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |