Флейм
GameDev.ru / Флейм / Форум / Архитектура без исключений (C++) (3 стр)

Архитектура без исключений (C++) (3 стр)

Поделиться
Страницы: 1 2 3 4 5 6 7 Следующая »
war_zesПостоялецwww6 дек. 201716:54#30
попробовал в этом https://godbolt.org
свой пример:
#include <cstdlib>

bool foo1()
{
  if ( rand() % 100 == 21 )
    return false;    

  return true;
}

потом заменил return false; на throw. компилятор добавляет условный переход в каждую функцию с throw

 je      .LBB0_2
        mov     al, 1
ну и тела этих новых функций

Правка: 6 дек. 2017 17:10

war_zesПостоялецwww6 дек. 201716:56#31
return [](){};
> В другом compilation unit
и где мы их должны искать? ну нет там этого кода. Я не разбираюсь в этом говносайте и не смог найти никаких других юнитов.

почему нельзя было сделать нормальный пример?
Я не вижу в твоем примере сравнения листинга с исключениями и без. В нем только код с исключениями.


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

Правка: 6 дек. 2017 17:15

return [](){};Участникwww6 дек. 201717:16#32
war_zes
Люди вроде биджаха и панцершрека все поняли.
Я знаю, что травить нубов не хорошо и я должен сделать лекцию про то что такое compilation unit и как работает линковка, но мне лень.
Возвращайтесь через восемь лет.
Panzerschrek[CN]Участникwww6 дек. 201717:24#33
war_zes
> почему нельзя было сделать нормальный пример?

Да уж, человек с высшим образованием, а основ не понимает.

beejahПостоялецwww6 дек. 201717:26#34
war_zes
Ты точно не путаешь "оптимальный" и "компактный"?
beejahПостоялецwww6 дек. 201717:49#35
return [](){};
> Да понятно, что это синтетика, в реале надо приложить крестоскиллы чтобы
> разница в перформансе вообще заметна стала.
Ну тут надо понимать, что конкретно под эксепшоны могут быть (и будут, это же крестуханы) перспективе какие-то стандарто-перемены, которые реализуются быстро-шаманствами в компиляторах (и цпу, например - просто проложат, например, отдельную аппрататную шину под эксепшоны, лол).
А ретурн-диспатчинг  - это общий механизм, компилятор вообще его никак не связывает с его применением - он уже быстрее работать не может.
nesПостоялецwww6 дек. 201718:35#36
return [](){};
>В другом compilation unit
В студию.
-Eugene-Постоялецwww6 дек. 201718:43#37
return [](){};
> Люди вроде биджаха и панцершрека все поняли.
Даже я понял. А я не писал движки десять лет.
return [](){};Участникwww6 дек. 201718:49#38
beejah
Современные эксепшоны затачиваются на максимальную производительность в случае когда они не кидаются, чтобы даже постоянная проверка флажков не нужна была (они даже называются zero-overhead), но это достигается утяжелением собственно кода выброса (который вызывается редко).
Конкретно в случае вин64 выброс эксепшона превращается в инициализацию всяких структур и последующий вызов виндового RaiseException, который генерит seh ексепшон, который потом перехватывается кресторантаймом. Кресторантайм получает вместе с эксепшоном весь контекст процессора на момент выброса. Он достает из контекста текущий указатель инструкций и смотрит в специальных таблицах какие деструкторы нужно вызвать в данном конкретном месте и как получить return pointer чтобы идти по стеку вызовов (там отдельная песня, return pointer может лежать хер знает где на стеке или вообще вычисляться, там есть встроенный скриптовый эрзац-язык для этого). Потом он собственно раскручивает стек и вызывает деструкторы, пока не дойдет до catch (часть, про то, как он находит catch и зачем там ебля с typeid пока пропустим). После раскрутки стека он просто устанавливает instruction pointer в нужное место в catch, обновляет другие регистры и возвращается из крестового обработчика seh (и экзекуция продолжается с этого нового instruction pointer). Это позволяет не иметь промежуточных проверок и вызовов деструкторов и обеспечить максимальную скорость в случае когда они не кидаются. В красноглазом мирке тоже самое +/- названия функций. Были и другие реализации с другими tradeoffs, но они вымерли.
Зарекался ведь не писать лекции, блять

Правка: 6 дек. 2017 18:51

beejahПостоялецwww6 дек. 201719:10#39
return [](){};
> там есть встроенный скриптовый эрзац-язык для этого
Что-то мне подсказывает, что этот эрзац-язык -  ввод для вбитого в бинарь подошвами куска windbg, лол.
Ну, это было бы логично.

Правка: 6 дек. 2017 19:11

return [](){};Участникwww6 дек. 201719:11#40
Во всяких жабах эксепшоны концептуально так же работают, опускаются ли они при этом до RaiseException - спроси у искандера, он у нас форумный эксперт.
return [](){};Участникwww6 дек. 201719:24#41
beejah
https://msdn.microsoft.com/en-us/library/ck9asaa9.aspx
С вычисляемым я кажись погорячился, да
beejahПостоялецwww6 дек. 201719:25#42
return [](){};
> Во всяких жабах эксепшоны концептуально так же работают,
Ну, в той концепции, в которой разницы между крестами и жавой нет вообще - да.
А так - извините, очень разные они. В жаве эксепшоны - это намного больше выше, чем обертка над джампами.

> опускаются ли они при этом до RaiseException
Я думаю, там наборот - виндоэксепшоны подымаются до жавамашины.
Если вообще на этот мастдай-стаф не кладется болт. Один хер, жава-господа просто выкинут на помойку реализацию машины, в которой летают какие-то машинные эксепшоны.

Правка: 6 дек. 2017 19:27

Panzerschrek[CN]Участникwww6 дек. 201719:32#43
beejah
> В жаве эксепшоны - это намного больше выше, чем обертка над джампами.

Ой ли? В чём особая разница?

beejahПостоялецwww6 дек. 201719:54#44
Panzerschrek[CN]
> Ой ли? В чём особая разница?
"Обобая"? Я бы скорее поинтересовался, что у них общего.
В жаве эксепшон - это просто throwable, у него есть backtrace, есть reason + общий механизм управления ресурсами.
В крестах эксепшон - это ничего. Ничего + дроч на эксепшон-сейф размером с весь язык.
Спроси у жава-господ, например, как часто они обсуждают эксепшн в конструкторе и есть ли у них возможность впендюрить его в деструктор.
Или как часто они обсуждают %subj%.
Страницы: 1 2 3 4 5 6 7 Следующая »

/ Форум / Флейм / Программирование

2001—2017 © GameDev.ru — Разработка игр