![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 1 Всего: 39 |
>А может в "С/С++ Общие вопросы" ? ;)
Мы же обсуждаем правильность (или неправильность, как считают некоторые, не буду показывать пальцем) решение трольтеков отказаться от исключений. Низя нам в общие вопросы ). -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
maxxant |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 8.9.2009 Репутация: нет Всего: 1 |
Во первых не совсем верно "исключения не поддерживаются в какой-то ОС" - исключения С++ это исключения только от компилятора, и вопрос в том поддерживает их компилятор или нет, операционная система здесь не причём. Хотя есть исключение - это последние версии ОС Symbian, там они интегрированы в компилятор, вот ссылка на документ описывающий зачем и как http://developer.symbian.com/main/download...0Exceptions.pdf. Поскольку Symbian это продукт Nokia, а теперь ей принадлежит и Qt, то для того чтобы сделать поддержку для S60 в Qt 4.6 просто необходимо обрабатывать исключения в самой библиотеке, именно поэтому там они и появились. Сама по себе Qt не генерирует исключения поскольку не все компиляторы это поддерживают ведь существуют и мало распростанённые ОС, где хорошо если С++ вообще есть. Тем не менее вы можете использовать исключения, как обычно в С++, если понимаете что делаете, хотя судя по вопросу, не понимаете ;) так что лучше не надо, а то отлаживать будете долго и ругать невинный компилятор. При использовании Qt необходимость в исключениях отпадает сама по себе, через механизм сигналов/слотов вы сможете не хуже других (ну почти) обрабатывать ошибки, н.р.: signals: void QTcpSocket::error ( QAbstractSocket::SocketError socketError ) подключили к слоту обработчика и обрабатывайте . С опытом использования Qt тяга к исключениям пройдёт. К тому же в больших проектах к исключениям относятся очень осторожно, поскольку их обработка плохо мастабируется (именно в С++, в других языках бывает по другому), и то что красиво смотриться в однопоточном приложении и практически независимом от библиотек проекте в несколько десятков файлов, может обернуться тихим ужасом и недельными отладками в более крупном, использующем несколько потоков (в каждом потоке свой стек, и не получиться передать исключения между ними, в отличие от сигнала ошибки в Qt). К сожалению, в реальности, большинство допущенных и коварных ошибок не генеряться исключениями и не связаны с возвращаемыми значениями функций, хотя было бы здорово. Большинство ошибок - это логические упущения программиста или проектировка системы. Пример с авиадиспетчерским центром веселит, по случайному совпадению, я как раз являюсь разработчиком ПО для диспетчерских центров, и не вижу никакой связи между исключениями и потерей данных, скорее наоборот, слава богу их у нас практически нет, ибо их поддержка была бы кошмаром, даже в небольшом модуле с 10 потоками. Кроме того, все подсистемы дублируются и месяцами тестируются. Аргументы что исключения упрощают, документируют, делают надёжнее по моему относятся только к сравнительно несложным проектам, то есть их применение уместно, но весьма умеренно и всегда по максимуму локально. В прошлом приходилось работать тестировщиком над системами забугорных самолётов (автопилоты, мониторинг систем), ну там так вообще только чистый "си", поскольку компилятор на порядок проще и потенциально содержит меньше ошибок, плюс иногда двойное дублирование - две параллельно работающих платформы на разных архитектурах процессора с контролем работы плюс вторая такая же дублирующая. |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: нет Всего: 33 |
Просто тема довольно интересная. Но увы, никому и в голову не придет, что это могут обсуждать в разделе по кроссплатформенному программированию. Сюда не так много народа заглядывает ;) А там вам и повеселее будет ![]() -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 1 Всего: 39 |
>ну там так вообще только чистый "си", поскольку компилятор на порядок проще и потенциально содержит меньше ошибок
Плюс си часто заставляет программиста писать более быстрый код, пусть временами и в ущерб понятности. Плюс сишный код впринципе работает быстрее, ибо классы, наследование, RTTI, исключения, опять же. Для автопилота это очень важно, я думаю. maxxant, и вообще очень познавательная история. >Просто тема довольно интересная Да лишь бы в "священные войны" не отправили, там так вообще кроме троллей мало кто прочитает. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
djamshud, ладно, уговорил, не используй исключения
![]() исключения поддерживаются именно на уровне операционной системы ![]() [irony]ну надо-же, в каждом потоке свой стек[/irony] кстати, исключения можно передавать между потоками, поток, который делает join, потом заново их бросает, все получается довольно прозрачно хозяйке на заметку: задача инженера - сделать реализацию простой, "просто" сделать сложнее чем сделать "сложно" ![]() поэтому кичиться тем, что у нас все сложно, поэтому мы не используем исключения - по меньшей мере странно, мы проектируем системы так, что-бы их потом было легко развивать искать в них ошибки, а исключения, при правильном использовании позволяют упростить систему, конечно можно сделать большую и сложную систему, и потом говорить, что если-бы мы использовали исключения, то была-бы вообще жопа... вообще, стоит посмотреть на джавистов/дотнетчиков, они делают приложения, удовлетворяющие такому количеству бизнес правил, какое большинству цэпэпэ программистов и не снилось, и при этом пользуются исключениями
![]() по случайному совпадению, я то-же являюсь разработчиком ПО для диспетчерских центров, слава богу не авиационных, и исключения мы используем во всех проектах написанных на С++ > и не вижу никакой связи между исключениями и потерей данных есть связь между неиспользованием исключений и ростом сложности / увеличением количества ошибок, связных с тем, что разработчик не предусмотрел, что та или иная операция не всегда выполняется корректно, вот и все. Добавлено через 1 минуту и 1 секунду что в этом плохого, я весь вечер этого и добиваюсь ![]() |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 1 Всего: 39 |
>djamshud, ладно, уговорил, не используй исключения
Т.е. вы отказываетесь показать хотя бы один случай, когда исключение спасет мир? Ну или хотя бы одну человеческую жизнь? То, что они усложняют сопровождение кода, я уже писал... И не получил ответа кстати. >есть связь между неиспользованием исключений и ростом сложности / увеличением количества ошибок, связных с тем, что разработчик не предусмотрел, что та или иная операция не всегда выполняется корректно, вот и все. Голословное заявление. Не видно связи между (не)использованием исключения и недосмотром за выполнением операций. Или вы в main городите один бааальшой перехватчик на все случаи жизни и обучаете его правильно реагировать на всевозможные ошибки, так, на всякий случай? -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: нет Всего: 10 |
||||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 1 Всего: 39 |
>да..... наследование конечно тормозит выполнение кода....
Мда... Хождение по таблицам виртуальных функций уже давно выполняется на специализированном сопроцессоре и равносилен одному такту ЦПУ... Быстрота особенно ощущается при наследовании в несколько поколений - там включается турбонаддув сопроцессора... А когда среди этого где-нибудь мелькает множественное наследние, запускатеся реактивная тяга... Такие дела... Добавлено @ 03:06 Речь естественно идет о полезном коде, накладные расходы в который не входят. И которые "тормозят" выполнение (полезного) кода. Upd. >исключения поддерживаются именно на уровне операционной системы Всегда думал, что это не так. По-моему компилятор сам в силах решить, как бросать и ловить исключения. Поделитесь ссылкой, где бы об этом поподробнее рассказывалось? Нагуглить с ходу не получилось. Это сообщение отредактировал(а) djamshud - 29.11.2009, 03:18 -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
maxxant |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 8.9.2009 Репутация: нет Всего: 1 |
2Lazin:
мы говорим, про исключения С++, каким боком они привязаны к операционке. То что в операционных системах MS Windows есть SEH, то что в юниксах есть сигналы, и исключения возникающие на уровне процессора при попытке обращения к памяти, деления на ноль и т.д. мы знаем, и как то, что это обрабатывается в операционке понятно. Только причём здесь исключения С++ ???. Они реализовываются вполне программно. отчего ирония? Как бы локальные объекты в каждом потоке живут не зависимо, и крутят свой стек в разные стороны одновременно.
это что C# ? Выше я упомянул, что в некоторых языках по другому. В java или .net исключения - это основной способ обработки ошибок. Причем здесь C++ Qt? логически некорректная операция на С++ не вызывает исключений, если это не задано явно через throw, даже деление на ноль, выход за пределы памяти вызывают системное исключение, либо сигнал. Исключения в С++ позволяют лишь локально, модульно упростить написание кода. В сочетании с Qt потребность в них практически отпадает, да и пользоваться осторожнее приходиться. Чувствуется вы потроллить сюда пришли. Как замечательно. И насколько хорошо у вас они сочетаются с Qt? Какие подводные камни могут встретиться при их использовании с Qt? Чувствуется ли их острая неоходимость? Может у вас ещё boost прикручен поэтому уж без них никак не получается? А может вы путается С++ с С# или ещё с чем, где есть полноценная поддерка исключений(если можно так сказать)? Это сообщение отредактировал(а) maxxant - 29.11.2009, 04:04 |
|||
|
||||
maxxant |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 8.9.2009 Репутация: нет Всего: 1 |
Тут больше конечно надёжность, ибо по международным требованиям: DO-178b многое нужно проверить. В том числе полное покрытие кода, т.е. компилируется инструментированный код, с помощью которого можно проверить; все ли операторы, функции, условия выполнились, и если что-то не выполняется, делается подробный анализ с отчётом об ошибке, либо обоснованием что всё нормально и этот код мёртвый, т.е default в свитчах и т.п. кот при данных условиях не выполняются. В с++ это очень сложно сделать даже используя в пол-мощи. Да и кстати да, там только realtime всегда, и никакого динамического выделения памяти, динамических загрузок чего либо. то есть от С++ толку в той области очень немного, а проблем вагон (не говоря про стоимость сертифицированных компиляторов для этого дела, только сишный компилятор для небольшого офиса (человек 10-15) с урезанной лицензией на 1 тип процессора из 20 возможных, чтобы купить нужно квартиру в Москве продать, и причём для каждого филиала отдельная лицензия нужна - сервера лицензий, аудиты, ...). Это сообщение отредактировал(а) maxxant - 29.11.2009, 04:31 |
|||
|
||||
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
все ждут пример, затаив дыхание ![]() вариант с кодами ошибок:
как видим, каждая операция, которая может либо завершиться успешно, либо нет - проверяется вручную, затем вышестоящий уровень, на основе кода ошибки пытается исправить положение если это возможно вариант с исключениями:
как видим, все то-же самое, только проверка ошибок автоматизирована, не нужно проверять что вернет каждая из-функций, вышестоящий уровень перехватывает те ошибки, которые он может исправить, остальные идут еще выше и обрабатываются там, к примеру, если не удается открыть файл - создается файл в другом месте и все повторяется, а если произошло что-то более серьезное, исключение идет дальше нетрудно заметить, что во втором варианте намного меньше boilerplate кода, к тому-же в первом варианте непонятно как передавать системные коды ошибок Это сообщение отредактировал(а) Lazin - 29.11.2009, 12:55 |
||||
|
|||||
Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
деревня ![]() при наследовании не создается куча таблиц вирт. функций, там по прежнему одна таблица, в самом объекте будет просто храниться указатель на таблицу, вот и все, к тому-же можно наследовать от класса, не содержащего вирт. функций То-есть вызов вирт-функции в наследнике и в родителе - одинаков, это получение указателя на ф-ю и вызов этой ф-ии, очень дешевая операция. в компиляторе VC++, оператор throw - реализуется через RaiseException, тоесть все исключения работают через SEH, и исключения С++(синхронные) и системные исключения (асинхронные), просто по дефолту, компилятор обрабатывает только C++ исключения, можно сделать так, что в вашей программе появятся такие исключения как AVException, DivByZeroException итд в *nix ах наверное то-же так можно сделать ![]()
![]() нет, join, это то место, где основной поток дожидается завершения дочернего, примерно так:
![]() прежде чем обвинять кого-либо в троллинге и некомпетентности, нужно самому научиться разбираться в вопросе, системные исключения можно транслировать в исключения С++(типизировать), их можно перехватывать через catch(...) (игнорировать тип) я не использую Qt, я вообще не пишу приложения с пользовательским интерфейсом естественно я использую boost, STL и много чего еще, и это не мешает мне писать приложения, работающие в режиме 24x7 нельзя использовать ни одну современную С++ библиотеку, не используя исключения |
||||||
|
|||||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: нет Всего: 33 |
Вах. Дочитал
![]() -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
djamshud |
|
||||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 1 Всего: 39 |
>деревня
Ок. Маленький бенчмарк (полностью высосанный из пальца) для горожан. Вызывается (используется) всего пять методов.
для случая _1. И пять обыкновенных методов для случая _2.
Случай _1: real 0m1.891s real 0m1.887s real 0m1.910s Случай _2: real 0m1.170s real 0m1.178s real 0m1.177s Итого ~0.73 секунды простоя на 100 миллионов вызовов. Сишники могут порадоваться, их время меньше секунды. >можно наследовать от класса, не содержащего вирт. функций Можно. Но мы говорим о реальном использовании наследования, а это много виртуальных функций. Может быть не всегда, но на моей практике это обычно именно так. >в *nix ах наверное то-же так можно сделать Можно, но не нужно. К счастью оказалось, что операционка ничего не знает о плюсовых исключениях, и это правильно, я считаю. Мир не перевернулся. Lazin, пример с ексепшином и кодом возврата посмотрю чуть позже. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
||||
|
|||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
Если методы в классе делают что-то сложнее "a + b", то оверхед на вызов будет очень мал относительно исполнения всего кода. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
![]() ![]() ![]() |
Правила ведения Религиозных войн | |
|
1. Уважайте собеседника 2. Собеседник != враг 3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez" С уважением, Smartov. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Религиозные войны | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |