В чем разница между Слэй против Карлика против Сеха?

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

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

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

Соображения:

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

124

Решение

Там краткий обзор MinGW-w64 Wiki:

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

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

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

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

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

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

[…]

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

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

Смотрите также:

89

Другие решения

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

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

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

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

69

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector