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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вся правда об исключениях 
V
    Опции темы
georain
Дата 20.9.2008, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Тема об производительных издержках исключений поднималась уже не раз, и почти все заканчивались выводом о том, что если использовать исключения только для обработки ошибок (не в стандартном пути выполнения), то издержки малы. Но всё же не хватает конкретики.
1. Сколько? Сколько дополнительного кода выполняется при стандартном выполнении программы.

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

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

4. Развейте или подтвердите: функция содержащая генерацию исключения или блок обработки не может быть встроена.
PM MAIL   Вверх
J0ker
Дата 20.9.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



http://www.sco.com/developers/products/ehopt.pdf


Это сообщение отредактировал(а) J0ker - 20.9.2008, 18:27


--------------------
user posted image
PM MAIL   Вверх
georain
Дата 21.9.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну как я понял из статьи при использовании технологии обработки исключений с использованием таблиц с оптимизацией:
Цитата

1. Сколько дополнительного кода выполняется при стандартном выполнении программы.

Меньше 5%.

Цитата

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

Тут не понятно. Вроде как спецификации должны давать оптимизацию, но компиляторы эту возможность плохо поддерживают.

+ Что-то я так и не понял, спецификации в основную линию вносят дополнительный код или нет?

Цитата

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

Может, но делаю ли это реальные компиляторы?

Цитата

4. Развейте или подтвердите: функция содержащая генерацию исключения или блок обработки не может быть встроена. 

Functions with EH(Exception Handling) tables cannot easily be inlined, due to the tables’ contents being
determined in the compiler before the decision to inline is made.
Т.е. по идее может.

Это сообщение отредактировал(а) georain - 21.9.2008, 22:01
PM MAIL   Вверх
bsa
Дата 22.9.2008, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Все зависит от компилятора.
Например, компилятор от Borland не умеет встраивать функции содержащие циклы...
PM   Вверх
J0ker
Дата 22.9.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bsa @  22.9.2008,  08:54 Найти цитируемый пост)
Например, компилятор от Borland не умеет встраивать функции содержащие циклы... 

это как это  smile ???
может вы имели ввиду рекурсивные функции?


--------------------
user posted image
PM MAIL   Вверх
Mayk
Дата 23.9.2008, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(J0ker @  23.9.2008,  00:36 Найти цитируемый пост)

это как это  smile ???
может вы имели ввиду рекурсивные функции? 

Нет. Именно циклы. У него даже warning на это дело выдается.

Добавлено через 22 секунды
во всяком случае  в bcc551 warning есть.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
nickless
Дата 25.9.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(georain @  21.9.2008,  20:59 Найти цитируемый пост)
Может, но делаю ли это реальные компиляторы?

gcc например не генерирует код для обработки исключений для функций не бросающих исключения, т.е. вроде
Код

int bla() throw()



Из интереса провёл маленький тест,
класс:
Код

class Test {
public:
    int fun1(int a) {
        if (a < 0)
            throw 1;
        return 1111;
    }

    int fun2(int a) throw(int) {
        if (a < 0)
            throw 2;
        return 2222;
    }

    int fun3(int a) throw() {
        if (a < 0)
            throw 3;
        return 3333;
    }

    int fun4(int a) {
        return 4444;
    }

    int fun5(int a) throw() {
        return 5555;
    }
};


main
Код

int main()
{
    Test test;

    int x;
    std::cin >> x;
    int aaa = 0;
    int bbb = 0;
    int ccc = 0;
    int ddd = 0;
    int eee = 0;
    try {
        aaa = test.fun1(x*1000);
    } catch (int i) {
        std::cout << "1: " << i << std::endl;
    }
    try {
        bbb = test.fun2(x*2000);
    } catch (int i) {
        std::cout << "2: " << i << std::endl;
    }
    try {
        ccc = test.fun3(x*3000);
    } catch (int i) {
        std::cout << "3: " << i << std::endl;
    }
    try {
        ddd = test.fun4(x*4000);
    } catch (int i) {
        std::cout << "4: " << i << std::endl;
    }
    try {
        eee = test.fun5(x*5000);
    } catch (int i) {
        std::cout << "5: " << i << std::endl;
    }

    std::cout << "res: " << aaa << " " << bbb << " " << ccc << " " << ddd << " " << eee << std::endl;
    return 0;
}


код (без оптимизации)

вызов fun1:
Код

# FUN 1
#
    movl    -48(%ebp), %eax # x, x.62
    imull   $1000, %eax, %eax   #, x.62, D.21196
    movl    %eax, 4(%esp)   # D.21196,
    leal    -41(%ebp), %eax #, tmp111
    movl    %eax, (%esp)    # tmp111,
.LEHB5:
    call    _ZN4Test4fun1Ei #
.LEHE5:
    # basic block 3
    movl    %eax, -40(%ebp) # aaa.63, aaa


    jmp .L26    # jump через catch


# catch
#
.L38:
    # basic block 4
    movl    %eax, -64(%ebp) #,
    movl    %edx, -68(%ebp) #,
    cmpl    $1, -68(%ebp)   #,
    je  .L27    #,
    # basic block 5
    movl    -64(%ebp), %eax #,
    movl    %eax, (%esp)    #,
.LEHB6:
    call    _Unwind_Resume  #
.LEHE6:
.L27:
    # basic block 6
    movl    -64(%ebp), %eax #,
    movl    %eax, (%esp)    #,
    call    __cxa_begin_catch   #
    movl    (%eax), %eax    #* D.21174, tmp113
    movl    %eax, -20(%ebp) # tmp113, i
    movl    $.LC0, 4(%esp)  #,
    movl    $_ZSt4cout, (%esp)  #,
.LEHB7:
    call    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc #
    # basic block 7
    movl    %eax, %edx  #, D.21199
    movl    -20(%ebp), %eax # i, tmp114
    movl    %eax, 4(%esp)   # tmp114,
    movl    %edx, (%esp)    # D.21199,
    call    _ZNSolsEi   #
    # basic block 8
    movl    $_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, 4(%esp)    #,
    movl    %eax, (%esp)    # D.21200,
    call    _ZNSolsEPFRSoS_E    #
.LEHE7:
    # basic block 9
    call    __cxa_end_catch #
    jmp .L26    #
.L37:
    # basic block 10
    movl    %eax, -64(%ebp) #,
    movl    %edx, -68(%ebp) #,
.L28:
    movl    -68(%ebp), %esi #, save_filt.76
    movl    -64(%ebp), %ebx #, save_eptr.75
    call    __cxa_end_catch #
    movl    %ebx, -64(%ebp) # save_eptr.75,
    movl    %esi, -68(%ebp) # save_filt.76,
    movl    -64(%ebp), %eax #,
    movl    %eax, (%esp)    #,
.LEHB8:
    call    _Unwind_Resume  #
.LEHE8:


вызов fun2
Код

.L26:
    # basic block 11
# FUN 2
#
    movl    -48(%ebp), %eax # x, x.64
    imull   $2000, %eax, %eax   #, x.64, D.21202
    movl    %eax, 4(%esp)   # D.21202,
    leal    -41(%ebp), %eax #, tmp116
    movl    %eax, (%esp)    # tmp116,
.LEHB9:
    call    _ZN4Test4fun2Ei #
.LEHE9:
    # basic block 12
    movl    %eax, -36(%ebp) # bbb.65, bbb
    jmp .L29    #

# catch
.L36:
многабукв


вызовы fun3-5
Код

.L29:
    # basic block 20
# FUN 3
#
    movl    -48(%ebp), %eax # x, x.66
    imull   $3000, %eax, %eax   #, x.66, D.21208
    movl    %eax, 4(%esp)   # D.21208,
    leal    -41(%ebp), %eax #, tmp119
    movl    %eax, (%esp)    # tmp119,
    call    _ZN4Test4fun3Ei #
    movl    %eax, -32(%ebp) # ccc.67, ccc


# FUN 4
#
    movl    -48(%ebp), %eax # x, x.68
    imull   $4000, %eax, %eax   #, x.68, D.21214
    movl    %eax, 4(%esp)   # D.21214,
    leal    -41(%ebp), %eax #, tmp120
    movl    %eax, (%esp)    # tmp120,
    call    _ZN4Test4fun4Ei #
    movl    %eax, -28(%ebp) # ddd.69, ddd


# FUN 5
#
    movl    -48(%ebp), %eax # x, x.70
    imull   $5000, %eax, %eax   #, x.70, D.21220
    movl    %eax, 4(%esp)   # D.21220,
    leal    -41(%ebp), %eax #, tmp121
    movl    %eax, (%esp)    # tmp121,
    call    _ZN4Test4fun5Ei #
    movl    %eax, -24(%ebp) # eee.71, eee


с оптимизацией это всё инлайнится


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
vinter
Дата 25.9.2008, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

Репутация: 13
Всего: 56



Цитата(nickless @  25.9.2008,  20:12 Найти цитируемый пост)
 int fun3(int a) throw() {        if (a < 0)            throw 3;        return 3333;    }

в gcc,спецификация исключенний это тоже просто комменты?


--------------------
Мой блог
PM MAIL WWW   Вверх
nickless
Дата 25.9.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(vinter @  25.9.2008,  18:40 Найти цитируемый пост)
спецификация исключенний это тоже просто комменты? 

Не понял, почему "тоже"?

Добавлено через 1 минуту и 16 секунд
ЗЫ
Кстати в самой функции исключение генерируется не смотря на throw(), но при вызове не ловится.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Lazin
Дата 25.9.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



в vs спецификации исключений работают нестандартно, throw работает как надо, а непустая спеификация - все равно что ее отсутствие, почти как комментарий
PM MAIL Skype GTalk   Вверх
georain
Дата 25.9.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



nickless, спасибо.

Это сообщение отредактировал(а) georain - 25.9.2008, 20:34
PM MAIL   Вверх
J0ker
Дата 25.9.2008, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



в M$ ловятся в любом случае
разница - не разрушаются локальные объекты, т.к. функция объявленная throw() не добавляется в таблицу размотки


--------------------
user posted image
PM MAIL   Вверх
nickless
Дата 25.9.2008, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Lazin @  25.9.2008,  18:54 Найти цитируемый пост)
а непустая спеификация - все равно что ее отсутствие, почти как комментарий 

А, ясно, да g++ похоже использует спецификацию throw по назначению (судя по тестам).

Кстати версия GCC если что
Код

gcc version 4.3.1 (Gentoo 4.3.1-r1 p1.1)



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
J0ker
Дата 25.9.2008, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



nickless, а можете проверить как работает throw() если не сама эта функция вызвала throw, а та, которую она вызывает?
по идее все до нее должны размотаться, а она сама должна вызвать terminate()
меня интересует конкретно вопрос размотки


--------------------
user posted image
PM MAIL   Вверх
georain
Дата 25.9.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А куда в ассемблере в fun3 делся блок проверки условия и генерации исключения?

А это вызовы, сорри


Это сообщение отредактировал(а) georain - 25.9.2008, 20:40
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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