Förkompilerad rubrik
I datorprogrammering är en förkompilerad header (PCH) en ( C eller C++ ) header-fil som kompileras till en mellanform som är snabbare att bearbeta för kompilatorn . Användning av förkompilerade rubriker kan avsevärt minska kompileringstiden , särskilt när den tillämpas på stora rubrikfiler, rubrikfiler som innehåller många andra rubrikfiler eller rubrikfiler som ingår i många översättningsenheter .
Logisk grund
I programmeringsspråken C och C++ är en rubrikfil en fil vars text automatiskt kan inkluderas i en annan källfil av C-förprocessorn genom att använda ett förbehandlardirektiv i källfilen.
Rubrikfiler kan ibland innehålla mycket stora mängder källkod (till exempel rubrikfilerna windows.h
och Cocoa/Cocoa.h
på Microsoft Windows respektive OS X ). Detta är särskilt sant med tillkomsten av stora "header"-bibliotek som i stor utsträckning använder mallar , som Eigen math-biblioteket och Boost C++-biblioteken . De skrivs nästan uteslutande som header-filer som användaren #include
s, snarare än att länkas under körning. Sålunda, varje gång användaren kompilerar sitt program, kompilerar användaren i huvudsak även flera header-bibliotek. (Dessa skulle förkompileras till delade objekt eller dynamiska länkbibliotek i icke "header"-bibliotek.)
För att minska kompileringstiden tillåter vissa kompilatorer att header-filer kompileras till en form som är snabbare för kompilatorn att bearbeta. Denna mellanform är känd som en förkompilerad rubrik , och hålls vanligtvis i en fil som heter filtillägget .pch
eller liknande, såsom .gch
under GNU Compiler Collection .
Användande
Till exempel, givet en C++-fil source.cpp
som inkluderar header.hpp
:
//header.hpp ...
//source.cpp #include "header.hpp" ...
När du kompilerar source.cpp
för första gången med den förkompilerade rubrikfunktionen aktiverad, kommer kompilatorn att generera en förkompilerad rubrik, header.pch
. Nästa gång, om tidsstämpeln för denna rubrik inte ändrades, kan kompilatorn hoppa över kompileringsfasen relaterad till header.hpp
och istället använda header.pch
direkt.
Vanliga implementeringar
Microsoft Visual C och C++
Microsoft Visual C++ (version 6.0 och nyare [ citat behövs ] ) kan förkompilera vilken kod som helst, inte bara rubriker. Det kan göra detta på två sätt: antingen förkompilera all kod upp till en fil vars namn matchar filnamnsalternativet / Yc
eller (när /Yc
anges utan något filnamn
) förkompilera all kod fram till den första förekomsten av #pragma hdrstop
i koden Den förkompilerade utdata sparas i en fil med namnet efter filnamnet
som ges till /Yc
-alternativet, med filtillägget .pch
, eller i en fil som heter enligt namnet som tillhandahålls av /Fp - filnamnsalternativet
. Alternativet /Yu
, underordnat alternativet /Yc
om det används tillsammans, gör att kompilatorn använder redan förkompilerad kod från en sådan fil.
pch.h
(som heter stdafx.h
före Visual Studio 2017) är en fil som genereras av Microsoft Visual Studio IDE- guiden , som beskriver både standardsystem och projektspecifika inkluderingsfiler som används ofta men som nästan aldrig ändras.
afx i stdafx.h står för application framework extensions . AFX var den ursprungliga förkortningen för Microsoft Foundation Classes ( MFC). Även om namnet stdafx.h användes som standard i MSVC-projekt före version 2017, kan alla alternativa namn anges manuellt.
Kompatibla kompilatorer kommer att förkompilera den här filen för att minska den totala kompileringstiden. Visual C++ kommer inte att kompilera något före #include "pch.h"
i källfilen, om inte kompileringsalternativet /Yu'pch.h'
är avmarkerat (som standard); det antar att all kod i källan till och med den raden redan är kompilerad.
GCC
Förkompilerade rubriker stöds i GCC (3.4 och nyare). GCC:s tillvägagångssätt liknar dessa för VC och kompatibla kompilatorer. GCC sparar förkompilerade versioner av rubrikfiler med suffixet " .gch ".
Vid kompilering av en källfil kontrollerar kompilatorn om denna fil finns i samma katalog och använder den om möjligt.
GCC kan bara använda den förkompilerade versionen om samma kompilatoromkopplare är inställda som när headern kompilerades och den får använda högst en. Vidare får endast förbehandlare instruktioner placeras före den förkompilerade rubriken (eftersom den måste inkluderas direkt eller indirekt genom en annan normal rubrik, före eventuell kompilerbar kod).
GCC identifierar automatiskt de flesta rubrikfiler efter deras tillägg. Men om detta misslyckas (t.ex. på grund av icke-standardiserade rubriktillägg), -x-
växeln användas för att säkerställa att GCC behandlar filen som en rubrik.
klang
Clang - kompilatorn lade till stöd för PCH i Clang 2.5 / LLVM 2.5 från 2009. Kompilatorn både tokeniserar ingångskällkoden och utför syntaktiska och semantiska analyser av rubriker, skriver ut kompilatorns internt genererade abstrakta syntaxträd (AST) och symboltabell till en förkompilerad rubrikfil.
clangs förkompilerade header-schema, med vissa förbättringar såsom möjligheten för en förkompilerad header att referera till en annan, internt använd, förkompilerad header, utgör också grunden för dess modulmekanism. Den använder samma bitkodsfilformat som används av LLVM , inkapslat i klangspecifika avsnitt i Common Object File Format- eller Extensible Linking Format- filer.
C++ Builder
I standardprojektkonfigurationen genererar C++Builder -kompilatorn implicit förkompilerade headers för alla headers som ingår i en källmodul tills raden #pragma hdrstop
hittas. Förkompilerade rubriker delas för alla moduler i projektet om möjligt. Till exempel, när man arbetar med Visual Component Library , är det vanligt att inkludera vcl.h
-huvudet först som innehåller de flesta vanliga VCL-huvudfilerna. Således kan den förkompilerade rubriken delas över alla projektmoduler, vilket dramatiskt minskar byggtiden.
Dessutom kan C++ Builder instrumenteras för att använda en specifik header-fil som förkompilerad header, liknande mekanismen som tillhandahålls av Visual C++.
C++Builder 2009 introducerar en "Precompiled Header Wizard" som analyserar alla källmoduler i projektet för inkluderade header-filer, klassificerar dem (dvs exkluderar header-filer om de är en del av projektet eller inte har en Include-guard) och genererar och testar en förkompilerad rubrik för de angivna filerna automatiskt.
Pretokeniserad header
En pretokenized header (PTH) är en rubrikfil som lagras i en form som har körts genom lexikal analys , men inga semantiska operationer har gjorts på den. PTH finns i Clang innan det stödde PCH, och har även prövats i en gren av GCC.
Jämfört med en full PCH-mekanism har PTH fördelarna med språk (och dialekt) oberoende, eftersom lexikal analys är liknande för C-familjens språk och arkitekturoberoende, eftersom samma ström av tokens kan användas vid kompilering för olika målarkitekturer . Det har dock nackdelen att inte gå längre än enkel lexikal analys, vilket kräver att syntaktisk och semantisk analys av tokenströmmen utförs med varje kompilering. Dessutom, tiden för att kompilera skalning linjärt med storleken, i lexikaliska tokens, av den förtokeniserade filen, vilket inte nödvändigtvis är fallet för en fullfjädrad förkompileringsmekanism (PCH i clang tillåter slumpmässig åtkomst).
Clangs förtokeniseringsmekanism inkluderar flera mindre mekanismer för att hjälpa förbehandlaren: cachning av filexistens och datumstämpelinformation, och registrering av inkluderingsskydd så att bevakad kod snabbt kan hoppas över.
Se även
externa länkar
- Skötsel och matning av förkompilerade rubriker
- Förkompilerade rubriker med GCC
- Fractal eXtreme: Förkompilerade rubriker