В чем разница между 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 121

2 ответа:

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

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

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

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

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

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

  • КАРЛИК-2 (DW2) ЭХ, которым требуется использование отладочной информации 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