Усі компілятори C ++ мають одну серйозну проблему з продуктивністю. Складання C ++ коду - довгий і повільний процес.
Складання заголовків, що містяться вгорі файлів C ++, - дуже довгий і повільний процес. Складання величезних структур заголовків, що входять до складу API Windows та інших великих бібліотек API - дуже , дуже довгий і повільний процес. Доводиться робити це знову і знову і знову для кожного окремого вихідного файлу Cpp - це смертна кала.
Це не тільки для Windows, але стара проблема, з якою стикаються всі компілятори, яким доводиться компілювати такі великі API, як Windows.
Компілятор Microsoft може покращити цю проблему простим трюком, який називається попередньо складеними заголовками . Трюк досить гладкий: хоча кожен CPP-файл може потенційно та юридично надати рівномірно різний зміст ланцюгу файлів заголовків, що містяться вгорі кожного файлу Cpp (такими як, наприклад, різні макроси # define'd перед включеними, або шляхом включення заголовків у різному порядку), найчастіше це не так. Здебільшого у нас є десятки або сотні файлів, що включаються, але всі вони мають однакове значення для всіх файлів Cpp, що складаються у вашій програмі.
Компілятор може зробити величезну економію часу, якщо не потрібно починати компілювати кожен файл Cpp плюс його десятки включає буквально з нуля кожен раз.
Трюк полягає у призначенні спеціального файлу заголовка як вихідного пункту всіх ланцюгів компіляції, так званого файлу "попередньо складеного заголовка", який, як правило, є файлом з назвою stdafx.h просто з історичних причин.
Просто перелічіть усі ваші великі величезні заголовки для ваших API у вашому файлі stdafx.h у відповідному порядку, а потім запустіть усі ваші CPP-файли в самій вершині #include "stdafx.h"
, перед будь-яким змістовним вмістом (майже про єдине, що дозволено раніше, це коментарі).
За цих умов компілятор замість того, щоб починати з нуля , починає компілювати з уже збережених результатів компіляції всього в stdafx.h
.
Я не вірю, що цей трюк є унікальним для компіляторів Microsoft, і не думаю, що це був оригінальний розвиток.
Для компіляторів Microsoft, параметр , який наглядає за використанням прекомпілірованние заголовки управляються з допомогою аргументу командного рядка може використовувати компілятор /Yu "stdafx.h"
. Як ви можете собі уявити, використання імені stdafx.h
файлу - це просто умова; ви можете змінити ім'я, якщо цього хочете.
У Visual Studio 2010 цим параметром керує GUI за допомогою клацання правою кнопкою миші на проекті CPP, вибору "Властивості" та переходу до "Властивості конфігурації \ C / C ++ \ Попередньо складені заголовки". Для інших версій Visual Studio розташування в GUI буде іншим.
Зауважте, що якщо ви відключите попередньо складені заголовки (або запускаєте проект через інструмент, який не підтримує їх), це не робить вашу програму незаконною; це просто означає, що ваш інструмент буде збирати все з нуля кожного разу.
Якщо ви створюєте бібліотеку без залежностей від Windows, ви можете легко прокоментувати або видалити #include
s з stdafx.h
файлу. Немає необхідності видаляти файл сам по собі, але очевидно, що ви можете це зробити, відключивши налаштування заголовка прекомпіляції вище.