В чем разница между Слэй против Карлика против Сеха?
Я не могу найти достаточно информации, чтобы решить, какой компилятор мне использовать для компиляции моего проекта. На разных компьютерах есть несколько программ, имитирующих процесс. В 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?
Реализация Dwarf-2 EH для Windows вообще не предназначена для работы под 64-битными приложениями Windows. В режиме win32 обработчик отмены исключения не может распространяться через код, не поддерживающий dw2, это означает, что любое исключение, проходящее через любой код "чужих кадров", не поддерживающий dw2, завершится сбоем, включая системные DLL-библиотеки Windows и библиотеки DLL, созданные с помощью Visual Studio. Код раскрутки Dwarf-2 в gcc проверяет сборку раскрутки x86 и не может продолжить работу без другой информации раскрутки dwarf-2.
Метод обработки исключений SetJump LongJump работает в большинстве случаев как на win32, так и на win64, за исключением общих сбоев защиты. Поддержка структурированной обработки исключений в gcc разрабатывается для преодоления недостатков dw2 и sjlj. На win64 информация о размотке помещается в секцию xdata, и вместо стека есть.pdata (таблица дескрипторов функций). Для win32 цепочка обработчиков находится в стеке и должна быть сохранена / восстановлена реальным исполняемым кодом.
GCC GNU об обработке исключений:
GCC поддерживает два метода обработки исключений (EH):
- DWARF-2 (DW2) EH, который требует использования отладочной информации DWARF-2 (или DWARF-3). DW-2 EH может привести к тому, что исполняемые файлы будут слегка раздуты, потому что большие таблицы раскрутки стека вызовов должны быть включены в th исполняемых файлов.
- Метод, основанный на setjmp / longjmp (SJLJ). Основанный на SJLJ EH намного медленнее, чем DW2 EH (штрафует даже на обычное выполнение, когда не выдается никаких исключений), но может работать с кодом, который не был скомпилирован с GCC или у которого нет информации о разворачивании стека вызовов.
[...]
Структурированная обработка исключений (SEH)
В Windows используется собственный механизм обработки исключений, известный как структурированная обработка исключений (SEH). [...] К сожалению, GCC пока не поддерживает SEH. [...]
Смотрите также:
SJLJ (setjmp / longjmp): - доступно для 32-битных и 64-битных - не "без затрат": даже если исключение не генерируется, оно подвергается незначительному снижению производительности (~15% в коде с большим количеством исключений) - допускает исключения пройти через, например, обратные вызовы Windows
DWARF (DW2, dwarf-2) - доступен только для 32-разрядных систем - без постоянных накладных расходов во время выполнения - требуется, чтобы для всего стека вызовов была включена поддержка dwarf, что означает, что исключения не могут быть выброшены, например, системные библиотеки Windows.
SEH (исключение нулевых издержек) - будет доступно для 64-битного GCC 4.8.
источник: http://qt-project.org/wiki/MinGW-64-bit