Tutti i compilatori C ++ hanno un grave problema di prestazioni da affrontare. La compilazione del codice C ++ è un processo lungo e lento.
La compilazione delle intestazioni incluse nella parte superiore dei file C ++ è un processo molto lungo e lento. La compilazione delle enormi strutture di intestazione che fanno parte dell'API di Windows e di altre librerie di API di grandi dimensioni è un processo molto , molto lungo e lento. Dover farlo ancora e ancora, e ancora e ancora per ogni singolo file sorgente di Cpp è una morte.
Questo non è univoco per Windows ma un vecchio problema affrontato da tutti i compilatori che devono compilare contro un'API di grandi dimensioni come Windows.
Il compilatore Microsoft può migliorare questo problema con un semplice trucco chiamato intestazioni precompilate . Il trucco è piuttosto semplice: anche se ogni file CPP può potenzialmente e legalmente dare un significato leggermente diverso alla catena di file di intestazione inclusa in cima a ciascun file Cpp (per cose come avere macro diverse # definite prima delle inclusioni, o includendo le intestazioni in ordine diverso), spesso non è così. Il più delle volte, abbiamo dozzine o centinaia di file inclusi, ma tutti hanno lo stesso significato per tutti i file Cpp che vengono compilati nella tua applicazione.
Il compilatore può fare enormi risparmi di tempo se non deve iniziare a compilare ogni file Cpp più le sue dozzine di inclusioni letteralmente da zero ogni volta.
Il trucco consiste nel designare uno speciale file di intestazione come punto di partenza di tutte le catene di compilation, il cosiddetto file di "intestazione precompilata", che è comunemente un file chiamato stdafx.h semplicemente per ragioni storiche.
Elenca semplicemente tutte le tue grandi enormi intestazioni per le tue API nel tuo file stdafx.h, nell'ordine appropriato, quindi avvia ciascuno dei tuoi file CPP in alto con un #include "stdafx.h"
, prima di qualsiasi contenuto significativo (quasi l'unica cosa consentita prima è Commenti).
In queste condizioni, invece di ricominciare da capo , il compilatore inizia la compilazione dai risultati già salvati della compilazione di tutto stdafx.h
.
Non credo che questo trucco sia unico per i compilatori Microsoft, né penso che sia stato uno sviluppo originale.
Per compilatori Microsoft, l'impostazione che controlla l'utilizzo di intestazioni precompilate è controllato da una riga di comando argomento al compilatore: /Yu "stdafx.h"
. Come puoi immaginare, l'uso del stdafx.h
nome del file è semplicemente una convenzione; puoi cambiare il nome se lo desideri.
In Visual Studio 2010, questa impostazione è controllata dalla GUI facendo clic con il pulsante destro del mouse su un progetto CPP, selezionando "Proprietà" e navigando su "Proprietà di configurazione \ C / C ++ \ Intestazioni precompilate". Per altre versioni di Visual Studio, la posizione nella GUI sarà diversa.
Nota che se disabiliti le intestazioni precompilate (o esegui il tuo progetto attraverso uno strumento che non le supporta), non renderà illegale il tuo programma; significa semplicemente che il tuo strumento compilerà ogni volta tutto da zero.
Se stai creando una libreria senza dipendenze di Windows, puoi facilmente commentare o rimuovere #include
s dal stdafx.h
file. Non è necessario rimuovere il file in sé, ma chiaramente è possibile farlo anche disabilitando l'impostazione dell'intestazione precompilata sopra.