Банк рефератов содержит более 364 тысяч рефератов, курсовых и дипломных работ, шпаргалок и докладов по различным дисциплинам: истории, психологии, экономике, менеджменту, философии, праву, экологии. А также изложения, сочинения по литературе, отчеты по практике, топики по английскому.
Полнотекстовый поиск
Всего работ:
364139
Теги названий
Разделы
Авиация и космонавтика (304)
Административное право (123)
Арбитражный процесс (23)
Архитектура (113)
Астрология (4)
Астрономия (4814)
Банковское дело (5227)
Безопасность жизнедеятельности (2616)
Биографии (3423)
Биология (4214)
Биология и химия (1518)
Биржевое дело (68)
Ботаника и сельское хоз-во (2836)
Бухгалтерский учет и аудит (8269)
Валютные отношения (50)
Ветеринария (50)
Военная кафедра (762)
ГДЗ (2)
География (5275)
Геодезия (30)
Геология (1222)
Геополитика (43)
Государство и право (20403)
Гражданское право и процесс (465)
Делопроизводство (19)
Деньги и кредит (108)
ЕГЭ (173)
Естествознание (96)
Журналистика (899)
ЗНО (54)
Зоология (34)
Издательское дело и полиграфия (476)
Инвестиции (106)
Иностранный язык (62791)
Информатика (3562)
Информатика, программирование (6444)
Исторические личности (2165)
История (21319)
История техники (766)
Кибернетика (64)
Коммуникации и связь (3145)
Компьютерные науки (60)
Косметология (17)
Краеведение и этнография (588)
Краткое содержание произведений (1000)
Криминалистика (106)
Криминология (48)
Криптология (3)
Кулинария (1167)
Культура и искусство (8485)
Культурология (537)
Литература : зарубежная (2044)
Литература и русский язык (11657)
Логика (532)
Логистика (21)
Маркетинг (7985)
Математика (3721)
Медицина, здоровье (10549)
Медицинские науки (88)
Международное публичное право (58)
Международное частное право (36)
Международные отношения (2257)
Менеджмент (12491)
Металлургия (91)
Москвоведение (797)
Музыка (1338)
Муниципальное право (24)
Налоги, налогообложение (214)
Наука и техника (1141)
Начертательная геометрия (3)
Оккультизм и уфология (8)
Остальные рефераты (21692)
Педагогика (7850)
Политология (3801)
Право (682)
Право, юриспруденция (2881)
Предпринимательство (475)
Прикладные науки (1)
Промышленность, производство (7100)
Психология (8692)
психология, педагогика (4121)
Радиоэлектроника (443)
Реклама (952)
Религия и мифология (2967)
Риторика (23)
Сексология (748)
Социология (4876)
Статистика (95)
Страхование (107)
Строительные науки (7)
Строительство (2004)
Схемотехника (15)
Таможенная система (663)
Теория государства и права (240)
Теория организации (39)
Теплотехника (25)
Технология (624)
Товароведение (16)
Транспорт (2652)
Трудовое право (136)
Туризм (90)
Уголовное право и процесс (406)
Управление (95)
Управленческие науки (24)
Физика (3462)
Физкультура и спорт (4482)
Философия (7216)
Финансовые науки (4592)
Финансы (5386)
Фотография (3)
Химия (2244)
Хозяйственное право (23)
Цифровые устройства (29)
Экологическое право (35)
Экология (4517)
Экономика (20644)
Экономико-математическое моделирование (666)
Экономическая география (119)
Экономическая теория (2573)
Этика (889)
Юриспруденция (288)
Языковедение (148)
Языкознание, филология (1140)

Статья: Как ускорить компиляцию с помощью предкомпилированных заголовков в С Builder

Название: Как ускорить компиляцию с помощью предкомпилированных заголовков в С Builder
Раздел: Рефераты по информатике
Тип: статья Добавлен 05:42:24 09 апреля 2011 Похожие работы
Просмотров: 12 Комментариев: 15 Оценило: 2 человек Средний балл: 5 Оценка: неизвестно     Скачать

Как ускорить компиляцию с помощью предкомпилированных заголовков в С++ 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 <vcl.h>

#include <string>

#pragma hdrstop

Такая последовательность создаст образ, содержащий скомпилированные vcl.h и string. Этот образ будет использован для другого cpp-файла, если в нем до директивы hdrstop будут включены те же файлы, в том же порядке. Обращу внимание, что важен не только состав, но и порядок следования заголовков - даже если следующий cpp-файл включает те же заголовки, но сначала указан string, а потом vcl.h, то для этого cpp-файла будет создан новый образ.

Таким образом, для повторного использования предкомпилированного заголовка необходимо выполнение двух условий:

- состав включенный файлов до директивы hdrstop должен быть тем же

- последовательность включения файлов до директивы hdrstop должна быть той же

Сократить затраты на компиляцию стандартных заголовков до минимума можно только в том случае, если скомпилировать один образ, содержащий все стандартные заголовки, необходимые для проекта. Для этого нужно, чтобы:

- ВСЕ cpp-файлы проекта имели одинаковый блок включений до директивы hdrstop

- в этот блок должны входить ВСЕ стандартные заголовочные файлы, необходимые для проекта

Выполнить эти условия достаточно просто, для этого в начало каждого cpp-файла необходимо поместить следующие строки:

#include <pch.h>

#pragma hdrstop

где pch.h - файл, содержащий включения всех стандартных заголовков:

#ifndef PCH_H

#define PCH_H

#define INC_VCLDB_HEADERS

#define INC_VCLEXT_HEADERS

#include <vcl.h>

#include <sysset.h>

#include <IniFiles.hpp>

#include <AppEvnts.hpp>

#include <ActnMan.hpp>

...

#endif

Полный текст моей версии этого файла приведен в конце статьи. На h-файлы, входящие в предкомпилированный образ, накладывается ограничение - в них не должно быть инициализированных данных, например, в math.hpp есть строки:

static const Extended NaN = 0.0 / 0.0;

static const Extended Infinity = 1.0 / 0.0;

Из-за наличия этих констант включить math.hpp в файл pch.h нельзя.

Кстати, С++ Builder при добавлении новых модулей в проект реализует описанную стратегию управления предкомпилированными заголовками. Например, при создании нового приложения, файл Unit1.cpp будет таким:

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

....

Если посмотреть на текст vcl.h, то можно увидеть, что он является оболочкой для включения большого числа других стандартных заголовочных файлов.

Управлять составом включаемых в vcl.h заголовков можно с помощью специальных символов (INC_VCLDB_HEADERS, INC_VCLEXT_HEADERS и др.). В моей версии pch.h эти символы определяются с помощью #define до включения vcl.h, что приводит к увеличению числа включаемых файлов.

Как в существующем проекте перейти к использованию предкомпилированных заголовков

Даже в большом проекте перейти к использованию предкомпилированных заголовков достаточно просто.

В свойствах проекта нужно включить кэширование предкомпилированных заголовков и рекомендуется указать "персональный" файл, в котором будет храниться образ предкомпилированных заголовков: Project - Options - закладка Compiler, группа "Pre-compiled headers". Тут должно быть выбрано "Cache pre-compiled headers", а в поле "File Name" нужно ввести "pch.csm". При такой настройке образ с предкомпилированными заголовками будет находится в папке с проектом, в файле pch.csm.

После этого в начало каждого cpp-модуля необходимо вставить 2 строки:

#include "pch.h"

#pragma hdrstop

Все ранее включенные заголовочные файлы остаются на своих местах, их удалять не надо. Например:

#include "pch.h" // включает vcl.h, string и т.д.

#pragma hdrstop

#include <vcl.h>

#include <string>

...

Так как во всех стандартных заголовках применяются стражи повторного включения, то повторное их упоминание не влечет за собой повторного включения.

В принципе, при использовании pch.h, техническая потребность во включении стандартных заголовков исчезает. Однако, полезно все же указывать все необходимые для каждого конкретного модуля заголовки ниже директивы #pragma hdrstop. Во-первых, это в некоторой степени документирует модуль - по включаемым файлам можно судить, какими возможностями пользуется этот модуль. Во-вторых, это облегчает повторное использование модуля в других проектах, в которых либо не используется pch.h, либо его содержимое может быть другим.

Теоретически можно еще больше повысить эффективность компиляции, если включить в pch.h не только стандартные, но и все пользовательские заголовочные файлы. Практически, так как пользовательские заголовки меняются достаточно часто, это может повлечь за собой частую перекомпиляцию pch.h, что негативно скажется на времени компиляции. Кроме того, пользовательские заголовки обычно не бывают очень большими и компилируются очень быстро. Поэтому включать их pch.h не целесообразно.

Как проверить, что предкомпилированные заголовки используются эффективно

При добавлении в проект новых файлов нужно не забывать включать в них pch.h, иначе для них не будет использован общий предкомпилированный образ. Такая же ситуация может возникнуть, если в каком-то модуле включаются стандартные заголовки, которые не вошли в pch.h. Для того, чтобы отследить такие файлы, есть несколько способов:

- визуальное наблюдение за процессом компиляции. Обычно, число строк компилируемых в одном файле не должно превышать 10000-15000 строк

- если для проекта выбран индивидуальный файл для хранения образа предкомпилированных заголовков и этот файл называется pch.csm, то нужно обратить внимание на наличие вспомогательных файлов с именами pch.#00, pch.#01 и т.д. Если для всех файлов проекта используется один и тот же предкомпилированный образ, то вспомогательный файл должен быть только один - pch.#00. Если таких файлов больше, это значит что для каких-то cpp-модулей создаются дополнительные образы.

Текст pch.h

#ifndef PCH_H

#define PCH_H

#define INC_VCLDB_HEADERS

#define INC_VCLEXT_HEADERS

#include <vcl.h>

/* Все, что подключается предыдущими 3-мя строчками

// Core (minimal) Delphi RTL headers

#include <System.hpp>

#include <Types.hpp>

#include <Windows.hpp>

#include <Messages.hpp>

#include <SysUtils.hpp>

#include <Classes.hpp>

// Core (minimal) VCL headers

#if defined(INC_VCL)

#include <Controls.hpp>

#include <Graphics.hpp>

#include <Forms.hpp>

#include <Dialogs.hpp>

#include <StdCtrls.hpp>

#include <ExtCtrls.hpp>

// VCL Database related headers

#if defined(INC_VCLDB_HEADERS)

#include <DBCtrls.hpp>

#include <DB.hpp>

#include <DBTables.hpp>

#endif // INC_VCLDB_HEADERS

// Full set of VCL headers

#if defined(INC_VCLEXT_HEADERS)

#include <Buttons.hpp>

#include <ChartFX.hpp>

#include <ComCtrls.hpp>

#include <DBCGrids.hpp>

#include <DBGrids.hpp>

#include <DBLookup.hpp>

#include <DdeMan.hpp>

#include <FileCtrl.hpp>

#include <GraphSvr.hpp>

#include <Grids.hpp>

#include <MPlayer.hpp>

#include <Mask.hpp>

#include <Menus.hpp>

#include <OleCtnrs.hpp>

#include <OleCtrls.hpp>

#include <Outline.hpp>

#include <Tabnotbk.hpp>

#include <Tabs.hpp>

#include <VCFImprs.hpp>

#include <VCFrmla1.hpp>

#include <VCSpell3.hpp>

#endif // INC_VCLEXT_HEADERS

#endif // INC_VCL

*/

#include <sysset.h>

#include <IniFiles.hpp>

#include <AppEvnts.hpp>

#include <ActnMan.hpp>

#include <ActnCtrls.hpp>

#include <BandActn.hpp>

#include <CustomizeDlg.hpp>

#include <ImgList.hpp>

#include <ToolWin.hpp>

#include <ExtDlgs.hpp>

#include <ActnList.hpp>

#include <IBDatabase.hpp>

#include <IBCustomDataSet.hpp>

#include <IBQuery.hpp>

#include <IBTable.hpp>

#include <IBSQL.hpp>

#include <IBServices.hpp>

#include <math.h>

#include <assert.h>

#include <complex.h>

#include <values.h>

#include <map>

#include <list>

#include <set>

#include <vector>

#include <algorithm>

#include <functional>

#include <string>

#include <memory>

#include <fstream>

//нестандартные компоненты RxLib и EhLib

#include "CURREDIT.hpp"

#include "RXSpin.hpp"

#include "RxCalc.hpp"

#include "RxCombos.hpp"

#include "APPUTILS.hpp"

#include "RXDBCtrl.hpp"

#include "Placemnt.hpp"

#include "DBGridEh.hpp"

#endif

Оценить/Добавить комментарий
Имя
Оценка
Комментарии:
Если Вам нужна помощь с учебными работами, ну или будет нужна в будущем (курсовая, дипломная, отчет по практике, контрольная, РГР, решение задач, онлайн-помощь на экзамене или "любая другая" учебная работа...) - обращайтесь: https://clck.ru/P8YFs - (просто скопируйте этот адрес и вставьте в браузер) Сделаем все качественно и в самые короткие сроки + бесплатные доработки до самой сдачи/защиты! Предоставим все необходимые гарантии.
Харитон03:04:42 24 июня 2020
Привет студентам) если возникают трудности с любой работой (от реферата и контрольных до диплома), можете обратиться на FAST-REFERAT.RU , я там обычно заказываю, все качественно и в срок) в любом случае попробуйте, за спрос денег не берут)
Olya03:40:59 27 августа 2019
.
.03:40:59 27 августа 2019
.
.03:40:58 27 августа 2019
.
.03:40:57 27 августа 2019

Смотреть все комментарии (15)
Работы, похожие на Статья: Как ускорить компиляцию с помощью предкомпилированных заголовков в С Builder

Назад
Меню
Главная
Рефераты
Благодарности
Опрос
Станете ли вы заказывать работу за деньги, если не найдете ее в Интернете?

Да, в любом случае.
Да, но только в случае крайней необходимости.
Возможно, в зависимости от цены.
Нет, напишу его сам.
Нет, забью.



Результаты(259831)
Комментарии (3516)
Copyright © 2005-2020 BestReferat.ru support@bestreferat.ru реклама на сайте

Рейтинг@Mail.ru