Большинство наборов инструментов предлагает несколько опций оптимизации, а некоторые даже десятки. Какие оптимизации следует выбрать, зависит от требований к проекту. Например, во встраиваемых системах может потребоваться выбрать оптимизации, которые ценой некоторого уменьшения скорости приводят к созданию меньших по размеру исполняемых файлов. В других случаях приоритет может отдаваться скорости. Некоторые оптимизации сделают программу быстрее на одной платформе, но медленнее на другой. Вы можете даже столкнуться с тем, что некоторые опции сделают отдельные части программы быстрее, а другие части — медленнее.
Таблицы 1.26 и 1.27 показывают опции обобщенных оптимизаций, но для достижения наилучших результатов следует тщательно рассмотреть все требования, изучить документацию по инструментарию и провести всестороннее тестирование.
Эта ситуация аналогична встраиванию, хотя обычно инструментарии предоставляют значительно меньше опций для встраивания, чем для других оптимизаций
Смотри также
Рецепт 1.21.
1.23. Указание варианта библиотеки времени выполнения
Проблема
Ваш инструментарий поставляется с несколькими вариантами базовых библиотек времени выполнения, и вы хотите указать компилятору и компоновщику тот вариант, который должен использоваться.
Решение
Библиотеки времени выполнения, поставляемые с данным инструментарием, могут различаться по тому, являются ли они одно- или многопоточными, статическими или динамическими и содержат ли они отладочную информацию или нет.
При использовании Boost.Build эти три выбора можно сделать, использовав функции threading, runtime-link и variant, описанные в табл. 1.15. Например, чтобы указать статическую библиотеку времени выполнения, добавьте к требованиям цели <runtime-link>static или используйте опцию командной строки runtime-link=static. Чтобы указать многопоточную библиотеку времени выполнения, добавьте к требованиям цели <threading>multi или используйте опцию командной строки threading=multi.
При сборке из командной строки используйте опции компилятора и компоновщика, представленные в таблицах с 1.30 до 1.36. Опции командной строки и имена библиотек для отладочной и окончательной конфигураций обычно очень похожи. В следующих таблицах буквы в квадратных скобках добавляются только для отладочных конфигураций. Имена динамических вариантов библиотек времени выполнения показаны в круглых скобках. При выборе динамической компоновки эти библиотеки должны быть доступны при выполнении программы.
Табл. 1.30. Опции компилятора для выбора библиотеки времени выполнения при использовании Visual C++ или Intel (Windows)
Статическая компоновка Динамическая компоновка Однопоточная
-ML[d]¹ Неприменимо Многопоточная
-MT[d] -MD[d](msvcrt[d].dll, msvcr80[d].dll)²
¹ Начиная с Visual Studio 2005, в момент написания книги, находящейся в стадии бета-тестирования, опции -ML и -MLd считаются устаревшими, а однопоточные статические библиотеки времени выполнения больше не поставляются.
² Предыдущие версии Visual C++ использовали DLL msvcr71.dll, msvcr71d.dll, msvcr70.dll, msvcr70d.dll и т.д.
Табл. 1.31. Опции компилятора для выбора библиотеки времени выполнения при использовании Metrowerks (Windows)
Статическая компоновка Динамическая компоновка Однопоточная
-runtime ss[d] Неприменимо Многопоточная
-runtime sm[d] -runtime dm[d](MSL_All-DLL90_x86[_D].dll)Табл. 1.32. Опции командной строки для выбора библиотеки времени выполнения при использовании CodeWarrior 10 для Max OS X
Статическая компоновка Динамическая компоновка Опции не требуется Обратитесь к документации Metrowerks по опциям командной строки (
MSL_All_Mach-O[_D].dylib)
Табл. 1.33. Опции компилятора для выбора библиотеки времени выполнения при использовании Borland
Статическая компоновка Динамическая компоновка Однопоточная
-WM -WM- -WR -WC¹
(cc3260.dll) Многопоточная
-WM -WM -WR -WC (cc3260mt.dll)¹ Опция -WC требуется только при сборке консольного приложения.
Табл. 1.34. Опции компилятора для выбора библиотеки времени выполнения при использовании Digital Mars (все библиотеки времени выполнения многопоточны)
Статическая компоновка Динамическая компоновка Опций не требуется
-ND -D_STLP_USE_DYNAMIC_LIB(sccrt70.dll, stlp45dm.dll)Табл. 1.35. Опции компилятора для выбора библиотеки времени выполнения при использовании GCC
Статическая компоновка Динамическая компоновка
-static¹ Опций не требуется
¹ Эта опция отключает всю динамическую компоновку, а не только динамические библиотеки времени выполнения.
Например, чтобы указать динамическую окончательную сборку библиотеки времени выполнения Visual С++, используйте опцию компилятора -MD. Чтобы указать статическую однопоточную отладочную сборку библиотеки времени выполнения Metrowerks для Windows, используйте опцию компилятора -runtime ssd. Чтобы указать однопоточную динамическую сборку библиотеки времени выполнения Borland, передайте компилятору и компоновщику опции -WM- -WR -WC.
Инструкции для указания варианта библиотеки времени выполнения в IDE приведены в табл. 1.36.
Табл. 1.36. Указание варианта библиотеки времени выполнения из IDE
IDE Конфигурация Visual C++ На страницах свойств проекта перейдите к Configuration Properties→C/C++→Code Generation (Генерация кода) и используйте раскрывающийся список Runtime Library (библиотека времени выполнения) CodeWarrior Для проектов динамических библиотек добавьте в проект объектный файл
/usr/lib/dylib1.o и библиотеки
MSL_Shared_AppAndDylib_Runtime[_D].lib и
MSL_All_Mach-O[_D].dylib и удалите все библиотеки вида
MSL_<XXX>_Mach-O[_D].lib. Для проектов исполняемых файлов добавьте в проект объектный файл
/usr/lib/crtl.с и библиотеки
MSL_Shared_AppAndDylib_Runtime[_D].lib и
MSL_All_Mach-O[_D].dylib и удалите все библиотеки вида
MSL_<XXX>_Mach-O[_D].lib C++Builder Будет ли проект одно- или многопоточным, должно быть указано при его создании. Чтобы выбрать статическую или динамическую библиотеку времени выполнения, в окне Project Options перейдите к Linker и установите или снимите флажок Use dynamic RTL (Использовать динамические библиотеки времени выполнения) Dev-C++ Чтобы выбрать статическую библиотеку времени выполнения, укажите опцию командной строки
-static, как описано в рецепте 1.20 Обсуждение
Библиотека времени выполнения содержит реализации вспомогательных функций, необходимых при выполнении программы. Обычно библиотека времени выполнения содержит реализации функций стандартной библиотеки С, функций, используемых для доступа к сервисам операционной системы, таким как потоки и файловые системы, и специфичных для платформы, и функций, предоставляющих инфраструктуру для функций языка С++, таких как информация о типах во время выполнения (RTTI) и обработка исключений.
В большинстве случаев, чем больше у вас выбор, тем лучше. Однако слишком большое количество библиотек времени выполнения приводит к различным проблемам. Главной проблемой является гарантия того, что все компоненты приложения — статические библиотеки, динамические библиотеки и исполняемые файлы — используют один и тот же вариант библиотеки времени выполнения, Если это не так, то приложение может не скомпоноваться или в нем могут появиться сложные с точки зрения диагностики сбои.