ПредишенСледващото

C ++ Builder: как да се ускори събирането използване компилиран с глава

C ++ Builder: как да се ускори събирането използване компилиран с глава


Прекомпилирани заглавията може драстично да се увеличи
скорости компилацията.
Builder Language Guide C ++


Вместо да се веднага дам един пример. Пълна проект монтаж (натрупване), съдържащ около 170 CPP-модули, използващи компилиран глава настъпва при 811 секунди, броят на линиите се обработва от компилатора 1,808,780. Когато се съберат един и същ проект, без да използвате предкомпилират заглавията, време монтаж е 2399 секунди, и броя на обработените редове от компилатора - 45,261,820. Впечатляващо, нали? Таксата за това ускорение, по принцип не е голям - компилиран с изображение, чийто размер е около 40 MB.

Когато компилирате сорс кода, компилаторът трябва да обработва всички * .cpp файлове на проекта и всички от тях са включени в * .h - файлове. В същото време се третира като по поръчка на горни и стандарт като vcl.h или Word2k.h. Размерът на код, който е в стандартни заглавията може да бъде много голяма, например Word2k.h размер на файла надвишава 5 MB, в него повече от 130 000 реда код.

Тъй като съдържанието на стандартните заглавията не са се променили, те събират на всеки изграждане на проекта е загуба на време. Прекомпилирани заглавията помогнат за решаване на този проблем - стандартните като данните се събират веднъж и след това да използват прекомпилирани изображение.

Операционната принципа на прекомпилирани заглавията
За да контролирате компилиран предназначение директива компилатор #pragma hdrstop. Всички заглавни файлове са включени в настоящата директива, са поставени в едно изображение, например:

Това ще създаде последователност образ, съдържащ съставени vcl.h и низ. Това изображение ще се използва за други CPP-файл, ако иска да hdrstop директива ще включва едни и същи файлове в един и същи ред. Позволете ми да привлека вниманието ви към това, което е важно, е не само състава, но също и по реда на заглавната част - дори и ако на следващата CPP-файл включва същите заглавия, но първия сет: низ, а след това vcl.h, а след това за тази CPP-файл ще бъде генериран нов имидж.

По този начин, за повторна употреба предкомпилирана глава изисква две условия:

    - състав включва файлове, за да hdrstop директива трябва да бъде същият
    - файла с последователност, за да се даде възможност на hdrstop директива трябва да бъде същият

Намаляване на разходите по съставяне на стандартни заглавки до минимум може да се използва само ако се съберат на едно изображение, съдържащо всички стандартни заглавията, необходими за проекта. За да направите това, вие трябва да:
    - Всички проекти CPP-файлове имат едни и същи блок включванията към hdrstop на директива
    - това устройство трябва да включва всички стандартни заглавни файлове, необходими за проекта

Запознайте се с тези условия само достатъчни за тази цел в началото на всяка CPP-файл, който трябва да се облече в следните направления:

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

Пълният текст на моята версия на този файл се показва в края. На з-файлове, включени в компилиран изображение се наслагва ограничение - те не трябва да се инициализира данни, например, има линии math.hpp:

Поради наличието на тези константи включва math.hpp в pch.h не можете да подадете.
Между другото, C ++ Builder чрез добавяне на нови модули изпълнява проекти описано стратегия за управление на PCH. Така например, при създаването на ново заявление, unit1.cpp файл изглежда така:

Ако се вгледате в текста vcl.h, можем да видим, че това е обвивка за включването на голям брой други стандартни заглавки.

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

Както и в съществуващия проект да започнат да използват прекомпилирани хедър

Дори и в по-голям проект, за да започнете да използвате прекомпилирани заглавията е съвсем проста.

Първото нещо, което трябва да се създаде собствен хедър файл pch.h. Тя трябва да се поставя в папката на проекта, съдържанието на този файл е даден в края.

След това в свойствата на проекта да се даде възможност за кеширане предкомпилират заглавията, също така е насърчавана да се посочи "личен" файл, в който да се запази изображението предкомпилират заглавията: Проект - Настройки - раздел Compiler, групата "предварително компилиран" заглавки. Там трябва да се избере "Кеш предварително компилиран" заглавки и в полето "Име на файла", въведете "pch.csm". С тази конфигурация, един образ с прекомпилирани заглавията ще се намира в папката на проекта, в pch.csm файл.

След това в началото на всяка CPP-модул, който искате да вмъкнете 2 линии:

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

Тъй като в се използват всички стандартни заглавията Guard активирате отново, а след това се повтаря препратки към тях не води до възстановяване на връзката.

По принцип, когато се използва 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-модули са допълнителни изображения.
    - в свойствата на проекта, за да се даде възможност на опция Показване Общи съобщения (Project -> Options -> Compiler раздела). След това в прозореца на съобщенията ще се появи допълнителна информация в процеса на компилация, включително информация за това как да изтеглите прекомпилирани заглавки. Ако файлът е предкомпилирана изображението е изтеглен, прозореца на съобщенията, когато името му ще се появи "[C ++] Loaded прекомпилирани" заглавки.


За предходната
Ако над материала, представен там въпроси и коментари, аз съм готов да ги приеме - пише [email protected].


Послепис
Имам няколко пъти, за да докладват за проблеми с прекомпилирани заглавията - че строителят започва да се даде предупреждение "Dialogs.hpp (437): W8058 не може да се създаде компилиран с глава: инициализират данни в заглавната" и не създава компилиран с глава.
Защото от това, което е там, аз не разбирам, но както писах Aleutdinov Сергей Harizovich, той успя да намери временно решение:
цитат:

Проблемът е решен "временно решение".

Създаден AllHeaders.hpp заглавния файл, който включва целия VCL hodery (DevExpress, FIBPlus, притежавате рядко модифицирани заглавията, и т.н.)
Всеки проект файл се поставя в три направления:
#include
#include
#pragma hdrstop

Свързани статии

Подкрепете проекта - споделете линка, благодаря!