Часть полного текста документа:Как ускорить компиляцию с помощью предкомпилированных заголовков в С++ Builder Серебров Борис Precompiled headers can dramatically increase compilation speeds ... С++ Builder Language Guide Вместо вступления сразу приведу пример. Полная сборка (build) проекта, содержащего около 170 cpp-модулей, при использовании предкомпилированных заголовков происходит за 811 секунд, при этом число обработанных компилятором строк составляет 1,808,780. При компиляции того же проекта без использования предкомпилированных заголовков, время сборки составляет 2399 секунд, а число строк, обработанных компилятором - 45,261,820. Впечатляет, не так ли? Плата за это ускорение, в принципе не велика - предкомпилированный образ, размер которого около 40 Мб. При компиляции исходных текстов, компилятор должен обработать все *.cpp файлы проекта и все включенные в них *.h - файлы. При этом обрабатываются как пользовательские заголовочные файлы, так и стандартные, такие как vcl.h или Word2k.h. Количество кода, находящегося в стандартных заголовках может быть очень большим, например размер файла Word2k.h превышает 5 Мб, в нем больше 130 000 строк кода. Так как содержимое стандартных заголовков не изменяется, то их компиляция при каждой сборке проекта является напрасной тратой времени. Предкомпилированные заголовки помогают решить эту проблему - стандартные файлы компилируются один раз, а затем используется скомпилированный двоичный образ. Принцип действия предкомпилированных заголовков Для управления предкомпилированными предназначена директива компилятора #pragma hdrstop. Все заголовочные файлы, включенные до этой директивы, помещаются в один образ, например: #include #include #pragma hdrstop Такая последовательность создаст образ, содержащий скомпилированные vcl.h и string. Этот образ будет использован для другого cpp-файла, если в нем до директивы hdrstop будут включены те же файлы, в том же порядке. Обращу внимание, что важен не только состав, но и порядок следования заголовков - даже если следующий cpp-файл включает те же заголовки, но сначала указан string, а потом vcl.h, то для этого cpp-файла будет создан новый образ. Таким образом, для повторного использования предкомпилированного заголовка необходимо выполнение двух условий: - состав включенный файлов до директивы hdrstop должен быть тем же - последовательность включения файлов до директивы hdrstop должна быть той же Сократить затраты на компиляцию стандартных заголовков до минимума можно только в том случае, если скомпилировать один образ, содержащий все стандартные заголовки, необходимые для проекта. Для этого нужно, чтобы: - ВСЕ cpp-файлы проекта имели одинаковый блок включений до директивы hdrstop - в этот блок должны входить ВСЕ стандартные заголовочные файлы, необходимые для проекта Выполнить эти условия достаточно просто, для этого в начало каждого cpp-файла необходимо поместить следующие строки: #include #pragma hdrstop где pch.h - файл, содержащий включения всех стандартных заголовков: #ifndef PCH_H #define PCH_H #define INC_VCLDB_HEADERS #define INC_VCLEXT_HEADERS #include #include #include #include #include ... #endif Полный текст моей версии этого файла приведен в конце статьи. ............ |