/arch - enable SSE and SSE2
/GL - include optimization of the entire program
/O1 - Reduces code size.
/O2 - Creates fast code.
/Og - Uses a global optimization.
/Os - Gives priority to reduce code size.
/Ox - Uses maximum optimization (for speed)
Задание параметра компилятора /Ox дает тот же результат, что и использование следующих параметров.
Параметр /Ob (расширение встроенных функций), где параметр варианта равен 2 (/Ob2)
/Og (Виды глобальной оптимизации)
/Oi (создание встроенных функций)
/Ot (приоритет скорости выполнения кода)
/Oy (подавление указателей фрейма)
Параметр /Ox несовместим со следующими параметрами:
/O1 (минимизировать размер)
/O2 (максимизировать скорость)
/Od (Выключение (отладчика))
Параметр компилятора /Ox также включает оптимизацию именованных возвращаемых значений, после чего для стековых возвращаемых значений не используются конструкторы копирования и деструкторы. Дополнительные сведения см. в разделе /O1, /O2 (минимизировать размер, максимизировать скорость).
Можно отменить параметр компилятора /Ox, если задать параметр /Oxs, который сочетает параметр компилятора
/Ox с /Os (приоритет небольшому размеру кода). Объединенные параметры отдают приоритет меньшему размеру
кода.Как правило, следует задавать параметр /O2 (максимизировать скорость) вместо /Ox и /O1
(минимизировать размер) вместо /Oxs.
Программирование без RTL
По умолчанию си-программы собираются вместе с библиотекой времени исполнения (она же RTL), которая занимает много
килобайт и обеспечивает работу функций типа spritnf. Но ведь Windows NT уже включает в себя RTL, реализованную в NTDLL.
DLL, так зачем же нам еще одна?чтобы собрать программу без RTL, достаточно назвать главную
функцию не main, а как-нибудь иначе, например _start. умные линкеры сами поймут, что это — точка входа. глупым (к которым,
в частности, относится MS LINKER) потребуется указать точку входа явно:
cl.exe /c file_name.c /Ox
link.exe file_name.obj /ENTRY:start /SUBSYSTEM:WINDOWS USER32.lib
Сравнивая размеры программы с RTL и без нее, мы практически не обнаружим разницы в размерах, поскольку минимальная кратность выравнивания в 9x составляет 4 кб, она же используется линкером по умолчанию. В NT минимальная кратность составляет всего 16 байт, но линкер отказывается собирать такой файл, пока мы не притворимся, что
собираем драйвер:
link.exe file_name .obj /ENTRY:start USER32.lib /DRIVER /ALIGN:16
На этом примере, при компиляции MS VC 6 с RTL размер исполняемого файла составляет 24,576 кб, без RTL — 16,384 кб и, наконец, без RTL с минимальным выравниванием — 816 байт. как говорится, почувствуй разницу!
Комментариев нет:
Отправить комментарий