C++. Сборник рецептов
Шрифт:
Табл. 1.23. Отключение оптимизаций из IDE
| IDE | Конфигурация |
|---|---|
| Visual C++ | На страницах свойств проекта перейдите к Configuration Properties→C/C++→Optimization и установите опцию Optimization в значение Disabled (отключено). Для остальных опций на этой странице оставьте значения по умолчанию |
| CodeWarrior | В окне Target Settings перейдите к Code Generation→Global Optimizations (генерация кода→глобальная оптимизация) и выберите Off (выкл) |
| C++Builder | В Project Options перейдите к Compiler, в разделе Code optimization (оптимизация кода) выберите None |
| Dev-C++ | В Project Options
|
Табл. 1.24. Отключение встраивания из IDE
| IDE | Конфигурация |
|---|---|
| Visual C++ | На страницах свойств проекта перейдите к Configuration Properties→C/C++→Optimization и установите опцию Inline Function Expansion (расширение встраиваемых функций) в значение Default (по умолчанию) |
| CodeWarrior | В окне Target Settings перейдите к Language Settings→C/C++ Language и установите Inline Depth (глубина встраивания) в значение Don't Inline (не встраивать) |
| C++Builder | В Project Options перейдите к Compiler и в разделе Debugging установите флажок Disable inline expansions (отключить встраивание функций) |
| Dev-C++ | См. запись для GCC в табл. 1.20 и обратитесь к рецепту 1.20 |
Табл. 1.25. Включение отладочной информации в IDE
| IDE | Конфигурация |
|---|---|
| Visual C++ | См. табл. 1.22 |
| CodeWarrior | В окне Target Settings перейдите к Language Settings→Linker→PPC Mac OS X Linker и установите флажки Generate SYM File (генерировать SYM-файл) и Full Path in SYM Files (полные пути в SYM-файлах) |
| C++Builder | В Project Options перейдите к Compiler и установите флажки Debug information и Line Number Information (информация о номерах строк) |
| Dev-C++ | См. запись для GCC в табл. 1.21 и обратитесь к рецепту 1.20 |
Все наборы инструментов предоставляют опции для генерации в объектных и исполняемых файлах информации, которая позволяет отладчикам сообщать полезные данные при пошаговом выполнении программы. Эта информация обычно включает имена исходных файлов и номера строк, соответствующих определенному объекту или инструкциям машинного кода, а также информацию об объектах С++, занимающих определенные области памяти, включая их имена и типы.
Большинство наборов инструментов сохраняют отладочную информацию непосредственно в объектных и исполняемых файлах, но некоторые также предоставляют опцию для генерации отладочной информации в отдельных файлах базы данных. Например, в Visual C++ опция компилятора – Z7 указывает, что отладочная информация должна быть помещена в объектные и исполняемые файлы, а опции – Zi и – ZI указывают, что она должна быть сохранена в файлах базы данных программы, имеющих расширение .pdb. Опция – ZI включает функцию, которая называется Edit and Continue (отредактировать и продолжить), которая позволяет пользователям IDE изменять и перекомпилировать код, не прерывая сессии отладки. Аналогично CodeWarrior для Mac OS X по умолчанию генерирует отладочную информацию в файлах .SYM.
Большая часть наборов инструментов может генерировать отладочную информацию даже с включенными оптимизациями и встраиванием, хотя в некоторых случаях отладочная информация может оказаться несовместимой с некоторыми видами оптимизации. Однако при включении оптимизаций компилятор может увеличить эффективность кода, изменив порядок следования операторов или полностью реорганизовав фрагменты кода, в то время как внешне его поведение останется неизменным. Это делает отладку более
сложной, так как при этом теряется строгое соответствие между частями исходного кода и местами расположения объектов и машинным кодом. Это же верно и для встраивания: когда компилятор раскрывает встраиваемую функцию, объектный код, соответствующий этой функции, генерируется в теле вызывающей функции. При выполнении этого кода для встроенной функции не создается стекового фрейма. Помимо всего прочего это означает, что отладчик не сможет отобразить значения аргументов функции и ее локальных переменных. Обычно отладчики даже не пытаются сообщать о местах в исходном коде, соответствующих телам встроенных функций.По этим причинам обычно при создании отладочной сборки принято отключать оптимизации и встраивание.
Рецепт 1.22.
1.22. Создание окончательной сборки
Вы хотите создать небольшой быстрый исполняемый файл или динамическую библиотеку, предназначенные для распространения среди покупателей.
В основном для получения окончательной сборки требуется:
• включить оптимизации;
• включить расширение встраиваемых (inline) функций;
• отключить генерацию отладочной информации.
В табл 1.26 представлены опции компилятора и компоновщика, включающие оптимизацию и встраивание. Опций командной строки для отключения отладочной информации не существует: при сборке из командной строки отладочная информация по умолчанию отключена. Однако при использовании инструментария GCC размер исполняемых файлов и динамических библиотек можно уменьшить, указав компоновщику опцию – s.
Табл. 1.26. Опции компилятора, включающие оптимизации и встраивание
| Инструментарий | Оптимизация | Встраивание |
|---|---|---|
| GCC | – O3 | – finline-functions¹ |
| Visual C++ Intel | – O2 | – Оb1 |
| Metrowerks | – opt full | – inline auto -inline level=8 |
| Comeau (Unix) | – O3 | |
| Comeau (Windows) | To же, что и у основного компилятора, но вместо тире (-) используется слеш (/) | – inlining |
| Borland | – O2 | – vi |
| Digital Mars | – o+time | Включено по умолчанию |
¹ Эта опция автоматически включается при указании – O3.
Boost.Build предоставляет похожий механизм создания окончательной сборки: просто добавьте к требованиям цели
Некоторые IDE также предоставляют простой способ создания окончательной сборки. Например, как я говорил в рецепте 1.21, при создании нового проекта в Visual C++ IDE автоматически генерирует отладочную и окончательную конфигурации. Чтобы запросить окончательную сборку, просто выберите в меню Build опцию Configuration Manager и в качестве активной выберите конфигурацию Release. Также можно выбрать Release в раскрывающемся списке конфигураций на стандартной панели инструментов. При следующей сборке проекта будет создана окончательная сборка.
Аналогично при создании проекта в CodeWarrior с помощью одного из шаблонов проектов Metrowerks, называемых «принадлежности» (stationery), IDE автоматически генерирует отладочную и окончательную цели. Имя окончательной цели может быть разным, но оно всегда должно включать слово «release» или «final». Чтобы запросить окончательную сборку, в меню Project выберите пункт Set Default Target (установить цель по умолчанию), а затем выберите элемент меню, соответствующий окончательной цели. Также можно выбрать окончательную цель в раскрывающемся списке целей в окне проекта.