Förkompilerade rubriker

Förkompilerade headers ( eng.  pre-compiled headers ) - i programmeringsmiljöer i C och C ++  - ett sätt att påskynda kompileringen av program genom att förbearbeta de så kallade header-filerna som innehåller modulgränssnitt och, enligt normerna för dessa programmeringsspråk, kopplas till program genom att direkt infoga deras texter i huvudprogrammets kropp med hjälp av ett speciellt förbehandlardirektiv #include . Förkompilerade rubriker sparas på disken som filer i kompilatorns interna format, och när projektet kompileras om, minskar tiden för bearbetning och anslutning av dem avsevärt.

Bakgrund

Programmeringsspråket C använde header-filer för att ansluta en extern modul . Detta förenklar kompilatorn, och ger en viss flexibilitet – och det fungerade i 20 år, så länge rubrikerna var små och filerna i projektet var få. Med utvidgningen av mjukvaruprojekt började kompileringstiden att växa kvadratiskt [1]  - både antalet kompileringsenheter och antalet rubriker kopplade till varje specifik enhet ökar. I särskilt stora projekt tar en fullständig omkompilering tiotals minuter och utförs oftare under en nattlig konstruktion än på programmerares arbetsplatser.

Dessutom tillhör C-programmeringsspråket LR(1)-familjen , och därför är C-kompilatorer långsammare, till exempel Pascal (som är LL(1) ) .

För att minska kompileringstiden utvecklades förkompilerade rubriker. Eftersom header-filer ändras mycket mer sällan än filer som innehåller programkoden (och biblioteksfiler nästan aldrig), visade det sig vara ett rimligt optimeringsverktyg för att förbearbeta rubriker och konvertera dem till specialfiler som kan inkluderas när man kompilerar en program, förbi de första stegen av sammanställningen. På grund av förkompilering av rubriker bearbetas endast ändrade delar av programmet fullt ut av kompilatorn. Men förkompilering av rubriken hjälper inte alltid:

  1. Genom att ändra någon av de förkompilerade rubrikerna kompileras hela uppsättningen om.
  2. Med en fullständig omkompilering erhålls tidsvinsten när samma uppsättning används i minst två kompileringsenheter.

Därför ingår som regel alla typer av biblioteksrubriker, stora och samtidigt sällan förändrade, i den förkompilerade uppsättningen.

Implementeringar

Embarcadero C++ Builder

Allt som kommer före direktivet är förkompilerat #pragma hdrstop.

// main.cpp ///// Förkompilerade rubriker // C++ # include <cstdio> // STL # inkluderar <sträng> # inkluderar <vektor> # inkludera <karta> # inkluderar <algoritm> // OS-specifikt # include <windows.h> ///// Förkompileringen slutar här # pragma hdrstop ///// Andra rubriker # inkluderar "unit1.h" int main () { doUnit1 (); returnera 0 ; }

GCC

Vid kompilering hav -filer antar GCC automatiskt att en förkompilerad rubrik krävs (eller så kan den specificeras via kommandoraden, switch -x). De flesta programmeringsskal (som Code::Blocks ) låter dig ange vilka filer som ska förkompileras. Standardlösningen är att "dumpa" de mest använda, men sällan byta rubriker till en h-fil och inkludera den allra först.

// pch.h - förkompilera den (inställd i makefile eller project). // C++ # include <cstdio> # inkluderar <cmath> // STL # inkluderar <sträng> # inkluderar <vektor> # inkludera <karta> # inkluderar <algoritm> // OS-specifikt # include <windows.h> // unit1.cpp // förkompilerade först! # inkluderar "pch.h" // andra rubriker # inkluderar "unit1.h" void doUnit1 () { } // main.cpp // förkompilerade först! # inkluderar "pch.h" // andra rubriker # inkluderar "unit1.h" int main () { doUnit1 (); returnera 0 ; }

Microsoft Visual C++

Situationen liknar GCC. Visual C++ version 6.0 och högre förkompilerar rubriken med standardnamnet - stdafx.h(det här namnet kan ändras med ett kompilatoralternativ).

IDE:s New Project Wizard låter dig välja om du vill använda förkompilerade rubriker. Om du använder dem kommer kompilatoralternativet automatiskt att läggas till /Yu'stdafx.h', och kompilering av alla filer som inte innehåller kommer att misslyckas med ett fel. #include "stdafx.h"

Anteckningar

  1. Storskalig C++ Software Design Arkiverad 14 december 2014 på Wayback Machine John Lakos, 1996, s 334 "...minska kostnaden för att kompilera genom att eliminera det kvadratiska beteende vi observerade under tiden som C++-förprocessorn spenderade."

Länkar