В чем разница между sjlj vs dwarf vs seh?

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

Я делаю свой собственный тест с компиляторами MSVC и GCC. Позже один производит немного более быстрые двоичные файлы (для каждой субархитектуры). Хотя время компиляции намного больше, чем MSVC.

Так Что Я решил использовать MinGW. Но не могу найти никаких объяснений о методах обработки исключений и их реализациях в MinGW. Я могу использовать разные дистрибутивы для разных операционных систем и архитектур.

вопросы:

  • время компиляции и память не важны для моего использования. Важно только оптимизировать время выполнения. Мне нужно, чтобы мои программы были достаточно быстрыми. Допустим медленный компилятор.
  • ОС: Microsoft Windows XP / 7 / 8 / В Linux
  • архитектура: Intel Core i7 / Core2 / и очень старый i686 под управлением XP: P

2 ответов


есть краткий обзор на MinGW-w64 Wiki:

почему mingw-w64 gcc не поддерживает обработку исключений Dwarf-2?

на карлик-2 Э реализация для Windows не предназначена для работа под 64-разрядными приложениями Windows. В режиме win32 исключение обработчик размотки не может распространяться через не-dw2-код, это означает что любое исключение, проходящее через любые не-dw2, знает "внешние кадры" код завершится ошибкой, включая системные библиотеки DLL и DLL Windows, построенные с Visual Studio. Код размотки Dwarf-2 в gcc проверяет x86 разматывать агрегат и не может продолжать без другого гнома-2 размотайте информацию.

на SetJump LongJump метод обработки исключений работает для большинства случаи как на win32, так и на win64, за исключением общих ошибок защиты. Поддержка структурированной обработки исключений в gcc разрабатывается для преодоление слабостей dw2 и sjlj. На Win64 в unwind-информация размещена в xdata-разделе и существует .аргумент PDATA (таблица дескрипторов функций) вместо стека. Для Win32, цепь обработчики находятся в стеке и должны быть сохранены / восстановлены real исполняемый код.

GCC GNU о Обработка Исключений:

GCC поддерживает два метода обработки исключений (EH):

  • КАРЛИК-2 (DW2) EH, которым требует использования отладочной информации DWARF-2 (или DWARF-3). DW-2 EH может вызывать исполняемые файлы слегка раздутый, потому что большие таблицы размотки стека вызовов должны быть включено в исполняемые файлы.
  • метод, основанный на setjmp / longjmp (SJLJ). Sjlj-based EH намного медленнее, чем DW2 EH (штрафуя даже нормальное выполнение, когда нет исключения выбрасываются), но могут работать в коде, который не был скомпилирован с GCC или не имеет разматывания стека вызовов информация.

[...]

структурированная обработка исключений (SEH)

Windows использует свой собственный механизм обработки исключений, известный как структурированная обработка исключений (SEH). [...] К сожалению, GCC пока не поддерживает SEH. [...]

Читайте также:


SJLJ (setjmp / longjmp): - доступно для 32 бит и 64 бит-не "нулевая стоимость": даже если исключение не создается, оно вызывает незначительное штраф за производительность (~15% в тяжелом коде исключения) - допускает исключения чтобы пройти через, например, обратные вызовы windows

гном (DW2, dwarf-2) – доступно только для 32 бит – нет постоянных накладных расходов во время выполнения-нужен весь стек вызовов с поддержкой dwarf, который означает, что исключения не могут быть отброшены например, системные библиотеки DLL Windows.

SEH (исключение нулевых накладных расходов)-будет доступно для 64-разрядного GCC 4.8.

источник:http://qt-project.org/wiki/MinGW-64-bit