Le intestazioni precompilate (PCH) sono file speciali che alcuni compilatori possono generare per un file .cpp. Quello che sono è esattamente questo: codice sorgente precompilato. Sono codice sorgente che è stato alimentato tramite il compilatore e incorporato in un formato dipendente dal compilatore.
I PCH vengono comunemente utilizzati per velocizzare la compilazione. Inserisci le intestazioni comunemente utilizzate nel PCH, quindi includi solo il PCH. Quando fai un #include
sul PCH, il tuo compilatore in realtà non fa il solito #include lavoro. Carica invece questi simboli precompilati direttamente nel compilatore. Non è in esecuzione un preprocessore C++. Non eseguire un compilatore C++. No # include un milione di file diversi. Un file viene caricato e simboli appaiono completamente formata direttamente nell'area di lavoro del compilatore.
Menziono tutto questo perché i moduli sono PCHS nella loro perfetta forma. I PCH sono fondamentalmente un hack gigante costruito su un sistema che non consente moduli reali. Lo scopo dei moduli è in ultima analisi essere in grado di prendere un file, generare un file di modulo specifico del compilatore che contiene simboli, e poi qualche altro file carica quel modulo secondo necessità. I simboli sono precompilati, quindi, di nuovo, non c'è bisogno di includere un po 'di cose, eseguire un compilatore, ecc. Il tuo codice dice, import thing.foo
, e appare.
Controllare qualsiasi intestazione di libreria standard derivata da STL. Prendete <map>
per esempio. Le probabilità sono buone che questo file sia gigantesco o abbia molte #inclusioni di altri file che rendono il file risultante gigantesco. Questo è un sacco di parsing in C++ che deve accadere. Deve succedere per ogni file .cpp che contiene #include <map>
. Ogni volta che compili un file sorgente, il compilatore deve ricompilare la stessa cosa. Al di sopra di. E oltre. E ancora.
<map>
cambia tra le compilation? No, ma il tuo compilatore non può saperlo. Quindi deve continuare a ricompilarlo.Ogni volta che tocchi un file .cpp, deve compilare ogni intestazione che include questo file .cpp. Anche se non hai toccato le intestazioni o i file di origine che interessano quelle intestazioni.
I file PCH erano un modo per ovviare a questo problema. Ma sono limitati, perché sono solo un hack. Puoi includerne solo uno per ogni file .cpp, perché deve essere la prima cosa inclusa nei file .cpp. E poiché c'è un solo PCH, se si fa qualcosa che cambia il PCH (come aggiungere una nuova intestazione ad esso), è necessario ricompilare di tutto in quel PCH.
I moduli non hanno sostanzialmente nulla a che fare con il cross-compiler ABI (anche se uno di questi sarebbe bello, ei moduli renderebbero un po 'più facile definirne uno). Il loro scopo fondamentale è accelerare i tempi di compilazione.
Lo scopo fondamentale va oltre la semplice accelerazione dei tempi di compilazione .....: D –