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

Ответ 1

Вот краткий обзор на MinGW-w64 Wiki:

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

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

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

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

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

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

[...]

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

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

См. также:

Ответ 2

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

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

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

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