Попередньо відкомпілювалися заголовки

Попередньо відкомпілювалися заголовки (англ. Pre-compiled headers) - в середовищах програмування на мовах Сі та Сі ++ - спосіб прискорити компіляцію програм за рахунок попередньої обробки так званих заголовних файлів. які містять інтерфейси модулів і, згідно з нормами даних мов програмування, підключаються до програми шляхом прямої вставки їх текстів в тіло основної програми за допомогою спеціальної директиви препроцесора #include. Предкомпілірованние заголовки зберігаються на диску у вигляді файлів у внутрішньому форматі компілятора і при повторних компіляціях проекту час на їх обробку та підключення суттєво скорочується.

Мова програмування Сі для підключення зовнішнього модуля використовував заголовки. Це спрощує компілятор, і дає деяку гнучкість - і це працювало протягом 20 років, поки заголовки були невеликими, а файлів в проекті - мало. З укрупненням програмних проектів час компіляції стало рости квадратично [1] - збільшується як кількість одиниць компіляції. так і кількість заголовків, підключених до кожної конкретної одиниці. В особливо великих проектах повна перекомпіляція займає десятки хвилин і частіше виконується під час нічної збірки. ніж на робочих місцях програмістів.

До того ж мова програмування Сі відноситься до сімейства LR (1). і тому компілятори Сі повільніше, наприклад, Паскаля (який LL (1)) [джерело не вказано тисяча чотиреста два дні].

Щоб скоротити час компіляції, і були розроблені предкомпілірованние заголовки. Оскільки заголовки змінюються набагато рідше файлів, що містять код програми (а бібліотечні - практично ніколи), розумним засобом оптимізації виявилося виконувати попередню обробку заголовків, і перетворення їх у файли спеціального виду, які при компіляції програми можна підключати, минаючи перші стадії компіляції. За рахунок прекомпіляції заголовків повної обробці компілятором піддаються тільки змінені частини програми. Втім, попередня компіляція заголовка допомагає не завжди:

  1. При зміні будь-якого з предкомпіліруемих заголовків перекомпілюється весь набір.
  2. При повній перекомпіляції виграш за часом виходить, коли один і той же набір застосовується як мінімум в двох одиницях компіляції.

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

Предкомпіліруется все, що йде до директиви #pragma hdrstop.

При компіляції h-файлів GCC автоматично передбачає, що потрібно робити предкомпілірованний заголовок (або це можна вказати через командний рядок, ключ -x). Більшість оболонок програмування (наприклад, Code :: Blocks) дозволяють вказувати, які файли предкомпіліровать. Стандартним рішенням буде «звалити» найбільш використовувані, але рідко міняються заголовки в один h-файл і підключати його найпершим.

Ситуація схожа на GCC. Visual C ++ версії 6.0 і вище предкомпілірует заголовок зі стандартним ім'ям - stdafx.h. (Це ім'я можна змінити опцією компілятора). В IDE майстер створення проектів дозволяє вибрати, чи слід використовувати предкомпілірованние заголовки. При їх використанні буде автоматично додана опція компілятора /Yu'stdafx.h ', а компіляція будь-якого файлу, що не містить #include «stdafx.h», буде зупинена з помилкою.

Схожі статті