Як прискорити компіляцію з допомогою предкомпілірованних заголовків в с builder

Як прискорити компіляцію з допомогою предкомпілірованних заголовків в С ++ 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. Всі заголовки, включені до цієї директиви, поміщаються в один образ, наприклад:

Така послідовність створить образ, що містить скомпільовані vcl.h і string. Цей образ буде використаний для іншого cpp-файлу, якщо в ньому до директиви hdrstop будуть включені ті ж файли, в тому ж порядку. Зверну увагу, що важливий не тільки склад, але і порядок проходження заголовків - навіть якщо наступний cpp-файл включає ті ж заголовки, але спочатку зазначений string, а потім vcl.h, то для цього cpp-файлу буде створений новий образ.

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

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

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

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

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

- в цей блок має входити ВСЕ стандартні заголовки, необхідні для проекту

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

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

Схожі статті