Cu constructor cum să accelereze compilarea folosind antete precompilate - articole pe c - c -

C ++ Builder: Cum să accelerați compilarea folosind antete precompilate

În loc de introducere, dați imediat un exemplu. O construcție completă a unui proiect care conține aproximativ 170 de module cpp, când se utilizează antete precompilate, are loc în 811 secunde, în timp ce numărul liniilor compilate este de 1.808.780. Când compilați același proiect fără a utiliza antete precompilate, timpul de construire este de 2399 de secunde, iar numărul de linii procesate de compilator este de 45,261,820. Impresionantă, nu-i așa? Plata pentru această accelerare, în principiu, nu este mare - o imagine precompilată, a cărei dimensiune este de aproximativ 40 MB.







La compilarea codului sursă, compilatorul trebuie să proceseze toate fișierele de proiectare * .cpp și toate fișierele * .h incluse în ele. În acest caz, sunt procesate atât fișiere antet personalizate, cât și cele standard, cum ar fi vcl.h sau Word2k.h. Numărul de cod găsit în anteturile standard poate fi foarte mare, de exemplu, dimensiunea fișierului Word2k.h depășește 5 MB, există mai mult de 130.000 de linii de cod în el.

Deoarece conținutul anteturilor standard nu se schimbă, compilarea acestora cu fiecare construcție a proiectului este o pierdere de timp. Anteturile precompilate ajută la rezolvarea acestei probleme - fișierele standard sunt compilate o singură dată și apoi este utilizată o imagine binară compilată.

Principiul funcționării anteturilor precompilate

Pentru a controla directivele precompilate, se folosește directiva compilatorului #pragma hdrstop. Toate fișierele de antet incluse înaintea acestei directive sunt plasate într-o singură imagine, de exemplu:

Această secvență creează o imagine care conține vcl.h și șirul compilat. Această imagine va fi utilizată pentru alte cpp-fișier, în cazul în care acesta este de a hdrstop directivă va include aceleași fișiere în aceeași ordine. Lasă-mă să vă atrag atenția asupra ceea ce este important este nu numai compoziția, ci și ordinea header - chiar dacă următoarea cpp-fișier include aceleași titluri, dar primul set: șir, și apoi vcl.h, apoi pentru că cpp-fișier va fi generat nouă imagine.

Astfel, pentru a reutiliza antetul precompilat, trebuie îndeplinite două condiții:

  • compoziția fișierelor incluse înaintea directivei hdrstop trebuie să fie aceeași
  • Secvența de includere a fișierelor înaintea directivei hdrstop trebuie să fie aceeași

Reducerea costului de compilare a anteturilor standard la minim este posibilă numai dacă compilați o imagine care conține toate anteturile standard necesare pentru proiect. Acest lucru necesită:

  • Toate fișierele cpp ale proiectului au avut același bloc de incluziuni înainte de directiva hdrstop
  • Acest bloc ar trebui să includă TOATE fișierele header standard necesare pentru proiect

Este foarte simplu să executați aceste condiții, pentru aceasta, următoarele linii trebuie plasate la începutul fiecărui fișier cpp:







unde pch.h este fișierul care conține toate anteturile standard:

Textul integral al versiunii mele de acest fișier este dat la sfârșitul articolului. Fișierele h incluse în imaginea precompilată sunt constrânse - nu ar trebui să fie date inițializate în ele, de exemplu, în math.hpp există linii:

Din cauza acestor constante, nu puteți include math.hpp în fișierul pch.h.

Apropo, C ++ Builder implementează strategia de control descrisă a anteturilor precompilate atunci când adaugă noi module la proiect. De exemplu, atunci când creați o nouă aplicație, Unit1.cpp va fi după cum urmează:

Dacă te uiți la textul vcl.h, poți vedea că acesta este shell-ul pentru includerea unui număr mare de alte fișiere standard de antet.

Puteți controla compoziția anteturilor incluse în vcl.h cu caractere speciale (INC_VCLDB_HEADERS, INC_VCLEXT_HEADERS, etc.). În versiunea mea de pch.h, aceste caractere sunt definite folosind #define înainte ca vcl.h să fie activată, ceea ce duce la o creștere a numărului de fișiere incluse.

Ca și în proiectul existent, procedați la utilizarea anteturilor precompilate

Chiar și într-un proiect mare, este ușor să vă deplasați la utilizarea antetelor precompilate.

În proprietățile proiectului trebuie să activați cache-ul anteturilor precompilate și vă recomandăm să specificați un fișier "personal" în care vor fi stocate antetele precompilate: Project - Options - fila Compiler, grup "Pre-compiled headers". Aici ar trebui să selectați "Anteturi precompilate cache", iar în câmpul "Nume fișier" introduceți "pch.csm". Cu această setare, imaginea antecedentelor precompilabile se va afla în dosarul proiectului din fișierul pch.csm.

După aceea, la începutul fiecărui modul cpp, trebuie să introduceți 2 linii:

Toate fișierele antetului anterior incluse rămân în locurile lor, nu este necesar să le ștergeți. De exemplu:

Întrucât, în toate rubricile standard, se folosesc tutorii de reînscriere, re-menționarea lor nu implică reînscrierea.

În principiu, atunci când se utilizează pch.h, necesitatea tehnică de a include anteturile standard dispare. Cu toate acestea, este util să specificați toate anteturile necesare pentru fiecare modul particular de mai jos directiva #pragma hdrstop. În primul rând, documentează într-o oarecare măsură modulul - pe fișierele incluse puteți evalua ce funcții utilizează acest modul. În al doilea rând, facilitează reutilizarea modulului în alte proiecte, în care nu se utilizează fie pch.h, fie conținutul său poate fi diferit.

Teoretic, puteți îmbunătăți în continuare eficiența compilării prin includerea în pch.h nu numai standard, ci și toate fișierele antet personalizate. În practică, deoarece anteturile utilizatorilor se schimbă destul de frecvent, aceasta poate duce la recompilarea frecventă a pch.h, ceea ce va afecta negativ timpul de compilare. În plus, anteturile personalizate nu sunt de obicei foarte mari și sunt compilate foarte rapid. Prin urmare, includerea lor pch.h nu este recomandată.

Cum se verifică dacă anteturile precompilate sunt utilizate în mod eficient

Când adăugați fișiere noi în proiect, nu uitați să includeți pch.h în acestea, altfel imaginea precompilată obișnuită nu va fi folosită pentru ele. Aceeași situație poate apărea dacă anteturile standard sunt incluse în unele module care nu sunt incluse în pch.h. Pentru a urmări astfel de fișiere, există mai multe moduri:

  • vizualizarea procesului de compilare. De obicei, numărul de linii compilate într-un fișier nu trebuie să depășească 10.000-15.000 de rânduri
  • În cazul în care proiectul este selectat pentru un fișier individual pentru a stoca imagini precompilate antetele și fișierul este numit pch.csm, este necesar de menționat prezența fișierelor auxiliare cu numele PCH. # 00, PCH. # 01, etc. Dacă aceeași imagine precompilată este folosită pentru toate fișierele de proiect, atunci fișierul auxiliar trebuie să fie doar unul - pch. Dacă există mai multe astfel de fișiere, înseamnă că sunt create imagini suplimentare pentru unele module cpp.






Articole similare

Trimiteți-le prietenilor: