Vorkompilierte Header verwenden - Strategie?
-
Hallo,
konnte nur sehr wenig Information bezüglich der richtigen Verwendung der "Vorkompiliere Header" Funktion im C++ Builder 2006 finden.
(M)Eine Vorgehensweise bestünde darin, eine Headerdatei (nenne sie mal allheaders.h) zu erzeugen und darin alle im Projekt verwendeten Header ausschließlich der selbst erzeugten zu inkludieren.
Diese Datei ist dann in den eigenen Units jeweils vor der #pragma hdrstop Direktive einzufügen.
Meine Fragen dazu:
- ist das generell Quatsch?
- muß man die allheaders.h auch mit #ifndef x - #define x - #endif absichern? (Headerguard)
- macht es Sinn, eine Reihenfolge bei den Headern einzuhalten?
- soll man die ursprünglichen includes auskommentieren oder stehenlassen?
- wie macht man es in der .cpp datei richtig?Generell ist das Problem die immer größer werdende Kompilierzeit eines immer weiter wachsenden/wuchernden Projekts.
Für Hinweise zu entsprechender Literatur wär ich auch dankbar.
Gruß
Markus
-
maggai schrieb:
- ist das generell Quatsch?
Nein, das ist ein guter Ansatz. C++Builder 2009 kann so einen Master-Header auch automatisch generieren.
maggai schrieb:
muß man die allheaders.h auch mit #ifndef x - #define x - #endif absichern? (Headerguard)
Nein.
maggai schrieb:
macht es Sinn, eine Reihenfolge bei den Headern einzuhalten?
Im Prinzip sollte es unnötig sein, aber im realen Leben muß man zuweilen darauf achten (z.B. mit shlobj.h und vcl.h).
maggai schrieb:
soll man die ursprünglichen includes auskommentieren oder stehenlassen?
Dafür gibt es ja Header-Guards. Laß sie also besser stehen, so daß deine Projekte immer noch kompilierbar sind, falls du den Master-Header wieder entfernst.
Es gibt übrigens eine Compiler-Option, über die du den Master-Header implizit bei allen Modulen einbinden kannst. Dadurch mußt du ihn nicht überall manuell einbinden. Ebenso gibt es eine weitere Option, die sozusagen direkt danach ein #pragma hdrstop einfügt. Mit diesen beiden kannst du die Übersetzungsgeschwindigkeit wesentlich steigern.
maggai schrieb:
- wie macht man es in der .cpp datei richtig?
#pragma hdrstop nach dem Einbinden der letzten Headerdatei, die sich voraussichtlich nicht (allzuoft) ändert.
maggai schrieb:
Für Hinweise zu entsprechender Literatur wär ich auch dankbar.
http://en.wikipedia.org/wiki/Precompiled_header#Common_Implementations
-
.. hab es - glaub ich - verstanden. Das Projekt hat ~40 Units und manche Header ließen sich nicht vorkompilieren, weil sie eine Definition enthielten, wie beispielsweise die meisten Komponenten vom TMS-Component-Pack. Jetzt funktioniert aber der Ansatz mit der Master-Header-Datei.
Trotzdem dauerte das Kompilieren immer noch sehr/zu lange. Hier schafften dann aber glücklicherweise die C++ Compiler Enhancements von Andreas Hausladen http://andy.jgknet.de/blog/?page_id=12 Abhilfe.
Die Prozessorauslastung meines 3,6 GHz P4 mit Hyper Threading wurde während des Kompilierens im Taskmanager immer mit 7-15% angezeigt und er war damit ~4 mal langsamer als mein altes R40 Thinkpad mit 1,3 GhZ Pentium M (Centrino), daß aber voll ausgelastet war.
Keine Ahnung warum das so ist, vielleicht hängt es ja mit dem Hyper-Threading zusammen... Nach dem Installieren der C++ Compiler Enhancements jedenfalls lief das Projekt-Erstellen in nur einer Minute (56 Sek) ab. Vorher dauerte es ~20 Minuten!
Schönen Gruß
Markus