Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt неподдерживает exception. C чем это связано? Может на других OC нет их поддержки? 
:(
    Опции темы
djamshud
Дата 29.11.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>Если методы в классе делают что-то сложнее "a + b", то оверхед на вызов будет очень мал относительно исполнения всего кода. 

Смотря что и смотря где. Если это текстовый редактор, то и фиг с ним. А если это хреновина, считающая что-то несколько дней и делающая несметное количество вызовов, то уже многовато.

>Плюс си часто заставляет программиста писать более быстрый код, пусть временами и в ущерб понятности. Плюс сишный код впринципе работает быстрее, ибо классы, наследование, RTTI, исключения, опять же. Для автопилота это очень важно, я думаю.

Заметьте, я не говорил, что плюсы - тормоз несусветный. Я все лишь отметил несколько причин более медленной работы плюсов в сравнении с си. ~0.73 секунды это на неслабой машинке. Думается, на ПКшке пяти лет отроду разница будет заметнее, а на бортовом компьютере еще больше.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Lazin
Дата 29.11.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(djamshud @  29.11.2009,  14:53 Найти цитируемый пост)
Итого ~0.73 секунды простоя на 100 миллионов вызовов. Сишники могут порадоваться, их время меньше секунды.

не пускай пыль в глаза
вызов вирт. ф-ии при множественном виртуальном наследовании некорректно сравнивать с обычным вызовом ф-ии
хотя-бы потому, что если тебе нужна динамическая диспетчеризация вызова в зависимости от динамического типа объекта, тебе придется либо использовать вирт. ф-ю, либо изобретать свой аналог таблицы виртуальных функций
зы
за все время работы я ни разу не использовал множественное виртуальное наследование, засим все о виртуальных функциях, так-как это smile 
PM MAIL Skype GTalk   Вверх
djamshud
Дата 29.11.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>  smile 

В этом треде оффтопик на оффтопике и оффтопиком погоняет. Ради интереса, когда писал тот тест, виртуальное наследование заменял на множественное с указанием путей разруливания вызовов. Результат не изменялся совершенно, честное слово). Потому вернул обратно виртуальное, ибо лаконичней. По поводу нужности/не нужности (виртуального) множественного наследования - вопрос спорный. Просто множественное использую довольно часто, виртуальное - значительно реже, но тоже бывает.

На основании вашего примера можно сделать вывод либо о вашей безграмотности, либо о том, что вы пытаетесь привести заведомо неуклюжий пример, показывающий рулезность эксепшинов. Я искренне надеюсь, что второй вариант. Когда все кое-как исключения действительно рулят, браво! Куча сущностей и действий намешана в одну кучу, ну что это за детский сад? Писали бы вы на си - было б вам оправдание, хотя и на си пишут красивее. А тут классы зачем-то примешаны и эксепшины до кучи.

А что, если читать будем из файла? А писать в сокет? А если в UDP? А если читать из сокета, парсить его и писать в логгер результат? А если писать в БД распарсенную структуру? На каждый чих напишем функцию - это же так легко, а копипаста в наше время делается в два счета.

Давайте уж говорить о более общей задаче, ибо с++ позволяет замечательно абстрагироваться, - транслировании данных из одного источника в другой. Я бы сделал так (внимание! возможны синтаксические, семантические и логические ошибки. алсо примеры не дописаны, они лишь показывают суть):

Что-то позволяющее читать и/или писать:
Выделить всёРазвернуть кодкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
class someIO {
protected:
    int _errno;
    buffer _buf;//some like std::vector
    int rwlen;//TODO:must be optional
    virtual int realRead(int)=0;
public:
    enum {ERR_IO_READ=1,ERR_IO_WRITE,__LAST};
    someIO() {
        this->errno=0;
        this->rwlen=1024;
    }
    buf const& buf()const {
        return this->_buf;
    }
    int getErrno()const {
        return this->_errno;
    }
    int read(int);
    int write(someIO*);
    virtual int write(buffer const&)=0;
    virtual bool eof()=0;
};
int someIO::read(int len) {
    buf.reset();
    while (!this->eof()) {
        if (this->realRead(len==-1?this->rwlen:len)!=0)return this->_errno;
        if (len!=-1)break;
    }
    return 0;
}
int someIO::write(someIO *io) {
    while (!io->eof()) {
        if (io->read(this->rwlen)!=0)return 0;
        if (this->write(io->buf())!=0)return this->_errno;
    }
    return 0;
}


Файл обыкновенный. Для операций используется API C89.
Выделить всёРазвернуть кодкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
class fileIO:public someIO {
protected:
    FILE *file;
    int realRead(int);
public:
    enum {ERR_FOPEN=someIO::__LAST,ERR_FCLOSE,__LAST};
    fileIO():someIO() {
        this->file=0;
    }
    int open(char const*,char const* ="rw");
    int close();
    bool eof();
    int write(buffer const&);
};
int fileIO::open(char const *fname,char const *mode) {
    if ((this->file=fopen(fname,mode))==0)
        return this->_errno=ERR_FOPEN;
    return 0;
}
int fileIO::close() {
    errno=0;
    fclose(this->file);
    if (errno!=0)return this->_errno=ERR_FCLOSE;
    return 0;
}
int fileIO::write(buffer const &buf) {
    if (fwrite(buf.data(),sizeof(char),buf.count(),this->file)==0)
        return this->_errno=ERR_IO_WRITE;
    return 0;
}


Сокет. По идее он должен быть дальше наследован для определения свойств TCP- и UDP-соединений, но сейчас не суть.
Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
class socketIO:public someIO {
protected:
    int socket;
public:
    enum {ERR_SOCK_BIND=someIO::__LAST,ERR_SOCK_CREATE,/*other errors*/__LAST};
    int connect(char const *ip,short port);
//...
};


И наконец кульминация. Использование всей этой красоты. На разного рода ошибки навешиваются любые обработки в ифах и свичах с пустыми циклами. Можно их засунуть в вечные циклы или рекурсивно вызвать main - не суть и совершенно не касается нашей маленькой задачи.
Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
int main() {
    fileIO file;
    if (file.open("file")!=0) {}
    socketIO sock;
    if (sock.connect("127.0.0.1",22)!=0) {}
    file.write(&sock);
    switch (file.getErrno()) {}
    switch (sock.getErrno()) {}
    file.close();
    sock.close();
    return 0;
}


Сюда вместо кодов возврата можно с легкостью напихать исключений, и это даже избавит код от парочки ифов, но зато нагенерирует тьму исключиней, тремящихся вырваться за пределы приложения. И уж точно они не спасут пилотов самолета, с лучиками последней надежды смотрящих на автопилот.

Это сообщение отредактировал(а) djamshud - 29.11.2009, 20:42


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
andrew_121
Дата 29.11.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



djamshud, Если код писали вы, хорошо. Но не уметь форматировать код(хоть в каком-то стиле), это плохо. Очень интересно понять его, но глаза дороже.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>djamshud, Если код писали вы, хорошо. Но не уметь форматировать код(хоть в каком-то стиле), это плохо. Очень интересно понять его, но глаза дороже.

Прошу прощения, не уследил. Забыл через форматировщик прогнать. У меня на форматировании глаза разбегаются и мне становится сложно понимать код, поэтому при написании не использую его. Может быть когда-нибудь я избавлюсь от этого недостатка.

Fixed.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
andrew_121
Дата 29.11.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



djamshud, Спасибо.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Lazin
Дата 29.11.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(djamshud @  29.11.2009,  19:37 Найти цитируемый пост)
И наконец кульминация. Использование всей этой красоты. На разного рода ошибки навешиваются любые обработки в ифах и свичах с пустыми циклами. Можно их засунуть в вечные циклы или рекурсивно вызвать main - не суть и совершенно не касается нашей маленькой задачи.

я не назвал бы это красотой, это можно использовать на низком уровне, писать что-то более сложное так - не вариант
вы не понимаете мои аргументы, но в этом ничего страшного нет, видимо, для того, что-бы их понять, нужно иметь схожий с моим опыт smile
в моем понимании - исключения нужны для автоматизации обработки ошибок, это как ручное управление памятью и сборка мусора, ручное управление памятью может быть очень быстрым и эффективным, но увеличивает сложность, по сравнению с автоматическим, так и ручная обработка ошибок увеличивает сложность, заставляя программиста писать код, который гоняет туда сюда коды и контекст ошибок, вместо того, что-бы переложить это на иключения
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 29.11.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



 smile 
Выделить всёкод C++
1:
2:
3:
    int getErrno()const {
        return thid->_errno;
    }

ошибочка.

Выделить всёкод C++
1:
int open(char const*,char const="rw");

ошибочка.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



andrew_121, fixed. Не стоит столь придирчиво его исследовать, он не претендует на звание иконы. Просто мое мнение, как нужно решать подобные задачи на с++.

Добавлено через 11 минут и 41 секунду
>я не назвал бы это красотой, это можно использовать на низком уровне

Нет-нет, мой уважаемый и опытный собеседник, вы не правы. Он низкоуровневый лишь на уровне библиотеки - того, что использует программа main. Вместо fopen'ов внутри библиотеки можно использовать какие-нибудь stl-евские или Qt-шные костыли, суть не изменится. А уж на уровне приложения использование этой библиотеки высокоуровневое - дальше некуда.

>код, который гоняет туда сюда коды и контекст ошибок, вместо того, что-бы переложить это на иключения

Если бы вы посмотрели внимательнее, то обратили бы внимание, что ничто никуда не гоняетсяи обрабатывается там, где должно обрабатываться.

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
andrew_121
Дата 29.11.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(djamshud @  29.11.2009,  20:44 Найти цитируемый пост)
он не претендует на звание иконы

я атеист!



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 29.11.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Цитата(djamshud @  29.11.2009,  20:44 Найти цитируемый пост)
Исключительная - это когда мы читаем послание президента и вдруг находим в нем заветную фразу. Тут же летит исключение, перехватываемое в другом конце софтины, и вот уже на америку пошли бомболеты... 
Это как раз не исключительная - это то, ради чего послание читалось.  smile 

PM   Вверх
maxxant
Дата 30.11.2009, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 8.9.2009

Репутация: нет
Всего: 1



Цитата(Lazin @  29.11.2009,  13:24 Найти цитируемый пост)

нет, join, это то место, где основной поток дожидается завершения дочернего, примерно так:

boost::thread thread(backgroundWorker);
...
thread.join();
if (backgroundWorker.failed())
    backgroundWorker.throw_error();
в С++ это реализуется кривыми руками программиста


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

Цитата(Lazin @  29.11.2009,  13:24 Найти цитируемый пост)
я не использую Qt, я вообще не пишу приложения с пользовательским интерфейсом


Цитата(Lazin @  29.11.2009,  13:24 Найти цитируемый пост)
естественно я использую boost, STL и много чего еще, и это не мешает мне писать приложения, работающие в режиме 24x7. 


Ну и чудесно. Собственно я и не сомневался.

Цитата(Lazin @  29.11.2009,  13:24 Найти цитируемый пост)
нельзя использовать ни одну современную С++ библиотеку, не используя исключения


Qt не использует исключения, хотя и обрабатывает... собственно разговор изначально про неё и кроссплатформенность. Так вот я не вижу причин чтобы они оттуда генерились вообще - то есть необходимость такая и не нужна. Есть там своя надстройка над языком которая неплохо работает и главное реально упрощает код и обработку ошибок, а заодно и плохо совместима с С++ exceptions. Плюс ко всему существуют биндинги Qt для С и кучи других языков, в которых поддержка исключений либо отсутствует, либо реализована иначе. Плюс, чтобы вы там не говорили, худшее понимание кода менее опытными колегами, собственно, в опес сорсе и крупных конторах, типа гугла, мне чаще встречалось в гадлайнах  запрет на генерирование исключений. Ибо даже такое встречается часто:

Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
try
{
    char *p = new[somesize];
    call1(...);
    сall2(...);
     ...
    callN(...);
}
catch(blabla)
{
    some_error_report(...)
}



Кстати, говоря, возможно автор топика имел ввиду именно виндовый SEH, когда приводил пример с билдером. Только вот в Qt этого нет, то есть нужно делать действительно ручками для винды (ну или там при помощи MSVS) и для *никсов своими силами.


PM MAIL   Вверх
Lazin
Дата 30.11.2009, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(djamshud @  29.11.2009,  20:44 Найти цитируемый пост)
Если бы вы посмотрели внимательнее, то обратили бы внимание, что ничто никуда не гоняетсяи обрабатывается там, где должно обрабатываться.

ну это я вижу, но как корректно, черт возьми, можно обработать ошибку "диск, мать его, защищен от записи" в классе fileIO? smile

Цитата(maxxant @  30.11.2009,  02:54 Найти цитируемый пост)
Ну и чудесно. Собственно я и не сомневался.

не вижу поводов для язвительности, лично я считают GUI программистов низшей кастой smile 

Цитата(maxxant @  30.11.2009,  02:54 Найти цитируемый пост)
Плюс, чтобы вы там не говорили, худшее понимание кода менее опытными колегами, собственно, в опес сорсе и крупных конторах, типа гугла, мне чаще встречалось в гадлайнах  запрет на генерирование исключений.

В стайл гайде гугла есть запрет на исключения, но не потому что исключения это сложно, как раз наоборот, там проблема в другом, нужно заранее подумать, а что если вот эта ф-я/метод бросит исключение, не произойдет-ли утечка памяти или что-нибудь в этом роде, если у вас весь код - новый, вы в курсе, что существуют исключений и используете RAII для управления ресурсами, то все в порядке, но если у вас куча legacy кода, который написан так, как-будто исключений не существует, то могут быть проблемы. В общем, их старый код имеет плохой дизайн, ибо написан 10 лет назад, тогда, когда С++ имел мало общего с современным С++.
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 30.11.2009, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(Lazin @  30.11.2009,  06:44 Найти цитируемый пост)
"диск, мать его, защищен от записи"

последняя стадия. Доктор... smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 30.11.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>как корректно, черт возьми, можно обработать ошибку "диск, мать его, защищен от записи" в классе fileIO?

fopen(file,"w") потерпит фэйл, _errno станет ERR_FOPEN. При этом в _самом_ классе ее обрабатывать не нужно - не его это дело орать "ммммать, что-то пошло наперекосяк!".

Если вопрос касался детализации ошибки защищенного диска, то нужно добавить еще один тип ошибки. Я же не писал, что пример полон и готов к крупномасштабному внедрению. Как раз наоборот.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1004 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.