11 November, 2008

Мудёр

Вчера обнаружил очень приятную особенность компилятора С++ от VisualStudio 2008 для x86 - он автоматически удаляет блок try/catch если во всех вызовах функций между ними (в том числе и дочерних) не может возникнуть exception.

3 comments:

lastwalrus said...

Такую особенность я видел еще у Visual Studio 6.0 (какой sp сходу не вспомню) при включенной оптимизации кода.

Кисельгов said...

И надо заметить что это самая дурная особенность! Т.к. нормально предсказать появление эксепшиона компилятор не может. Его решение основывается только на С++ экспешионах при это полностью игнорируются SEH и эксепшионы математических операций (деление на ноль и т.п.) что приводит к полному развалу кода. Я однажды долго промучался... почему мой код математической операции не работает (на вход подавались невалидные данные и возникал SEH эксепшин математической операции), ведь защита try {} catch(...) установлена ? оказалось компилятор защиту выкинул "за ненадобностью"!Теперь вот во всех проектах приходится включать флаг /EHa

ww898 said...

/EHa - дорогое удовольствие в смысле производительности. В моих проектах это непозволительная роскошь...