Frage zur Kompilierung (cpp und h)
-
Ok, ich hatte einen kleinen Denkfehler bezüglich #include.
Grundsätzlich gesagt geht es mir um die Kompilierungszeit. Als Beispiel habe ich mehrere Klassen, welche in h und cpp aufgeteilt sind. Die Header werden alle in Main.cpp inkludiert. Da die Header-Dateien sich nicht ändern, stört es mich ein wenig, das diese bei jedem Kompilierungsvorgang vor die Main.cpp gesetzt werden und somit mit neu kompiliert werden. Ich nehme aber an, das es unmöglich ist dies zu verhindern, da sonst die Main.cpp die benötigten Deklarationen nicht kennt, korrekt?
@pumuckl: Mit dem Einhängepunkt meine ich z.B. bei Konsolenanwendungen die Main-Methode. Das hier ist mehr eine generelle Frage, einen Code gibt es nicht.
-
-
DarkBug schrieb:
Die Header werden alle in Main.cpp inkludiert.
Das heißt du hast eines der folgenden Dinge getan:
- nur eine Handvoll Header eingebunden
- tonnenweise Header eingebunden, deren Deklarationen du in der main benötigst
- tonnenweise Header eingebunden, obwol du nur eine Handvoll der Deklarationen du in der main benötigst
Letzteres ist einfach, binde nichts ein, was du nicht brauchst. Du brauchst auch weniger als du vermutlich denkst, google mal nach forward declaration.
Das erste ist kein problem, wenn du deinen Compiler nicht grade auf irgendeinem uralt,Ding laufen lässt. Mit einer Handvoll Header solltest du keine merklichen Compilezeiten haben. Punkt zwei bedeutet, dass du deine main-Methode mit Code überfrachtet hast, dann solltest du ein wenig refactoring betreiben, um die Compilezeit-Abhängigkeiten zu verringern.Precompiled Header nur für die main.cpp ist overkill.
-
Ist es nur möglich einen Precompiled Header pro Projekt zu haben? Das würde heißen, auch wenn nur seltend etwas an einem Header geändert wird: Sobald an nur einem Header eine Änderung vorgenommen wurde, werden alle Header neu kompiliert.
pumuckl schrieb:
Precompiled Header nur für die main.cpp ist overkill.
Warum? Ist die Kompilierungszeit die gleiche? Lohnt es sich erst bei mehr cpp-Dateien?
-
pumuckl schrieb:
Precompiled Header nur für die main.cpp ist overkill.
Ja, stimmt schon. Ich wollte nur der Unmöglichkeit widersprechen.

-
DarkBug schrieb:
Ist es nur möglich einen Precompiled Header pro Projekt zu haben?
Mir ist nicht bekannt, dass da mehrere machbar sind.
pumuckl schrieb:
Precompiled Header nur für die main.cpp ist overkill.
Warum? Ist die Kompilierungszeit die gleiche? Lohnt es sich erst bei mehr cpp-Dateien?
Der Gewinn bei einem Einsatz an nur einer Stelle ist nicht besonders groß. Dazu kommt, dass du mit Sicherheit auch andere Stellen haben wirst, wo PCH's Sinn machen, und wenn du Header, die nur einmal gebraucht werden, in den PCH einbindest, wird die Information in jeder ÜE mit PCH eingebunden, und das kostet, auch wenns im PCH vorkompiliert ist.
Man sollte nur das in den PCH packen, was oft benutzt wird und viele andere Header einbindet.
-
Darf man mal fragen, wie lange dein Projekt zum Erstellen braucht, dass du dir über sowas Gedanken machst?
-
_matze schrieb:
Darf man mal fragen, wie lange dein Projekt zum Erstellen braucht, dass du dir über sowas Gedanken machst?
Wahrscheinlich hat er insgesamt schon mehr Zeit beim Nachdenken über PCH verbraten als er Compilerzeit gespart hätte

-
pumuckl schrieb:
Precompiled Header nur für die main.cpp ist overkill.
DarkBug schrieb:
Warum? Ist die Kompilierungszeit die gleiche? Lohnt es sich erst bei mehr cpp-Dateien?
pumuckl schrieb:
Der Gewinn bei einem Einsatz an nur einer Stelle ist nicht besonders groß. Dazu kommt, dass du mit Sicherheit auch andere Stellen haben wirst, wo PCH's Sinn machen, und wenn du Header, die nur einmal gebraucht werden, in den PCH einbindest, wird die Information in jeder ÜE mit PCH eingebunden, und das kostet, auch wenns im PCH vorkompiliert ist.
Man sollte nur das in den PCH packen, was oft benutzt wird und viele andere Header einbindet.Wenn ich nur Header einbinde die nie verändert werden, werden diese doch nur beim ersten Kompilierungsvorgangs des Projekts mit pch kompiliert. Jeder weitere Kompilierungsvorgang ist dann schneller, oder?
_matze schrieb:
Darf man mal fragen, wie lange dein Projekt zum Erstellen braucht, dass du dir über sowas Gedanken machst?
Selbst ein kleines wxWidgets Projekt mit nur einer GUI-Klasse braucht 15 Sekunden zum kompilieren. Ist das normal?
-
DarkBug schrieb:
Selbst ein kleines wxWidgets Projekt mit nur einer GUI-Klasse braucht 15 Sekunden zum kompilieren. Ist das normal?
15 Sekunden? Und da machst du dir Gedanken, wie du die Compile-Zeit verringern kannst? Komm wieder, wenn du eine halbe Stunde brauchst. :p

-
DarkBug schrieb:
Wenn ich nur Header einbinde die nie verändert werden, werden diese doch nur beim ersten Kompilierungsvorgangs des Projekts mit pch kompiliert. Jeder weitere Kompilierungsvorgang ist dann schneller, oder?
Schneller, aber nicht unendlich schnell. Die Informationen, die in den PCH hineinkompiliert wurden, kosten trotzdem Zeit. Wenn du in deinem PCH 15.000 Header hast, in einer ÜE, die den PCH einbindet, aber nur 2 davon brauchst, kann es durchaus sein, dass der Compiler länger an dem PCH zu knabbern hat als an den zwei nicht vorkompilierten Headern.
Selbst ein kleines wxWidgets Projekt mit nur einer GUI-Klasse braucht 15 Sekunden zum kompilieren. Ist das normal?
Kommt auf die Hardware an
Und darauf, ob du irgendeinen "get-it-all" Header einbindest oder nur ein, zwei Header, die nur das einführen, was du auch wirklich brauchst. Und natürlich darauf, wo du die Header einbindest (.cpp, .h)
-
-j 8 :p
-
Kellerautomat schrieb:
-j 8 :p
-t 32
Was willst du uns mit diesem Kurzkommentar sagen??
-
pumuckl schrieb:
Und natürlich darauf, wo du die Header einbindest (.cpp, .h)
Wie meinst du das?
P.S.: Mit ÜE meinst du Übersetzungseinheit sprich cpp, oder?
-
Mit ÜE meinst du Übersetzungseinheit sprich cpp, oder?
Jup.
DarkBug schrieb:
pumuckl schrieb:
Und natürlich darauf, wo du die Header einbindest (.cpp, .h)
Wie meinst du das?
Wenn du deinen wxWidgets-Header in einer .cpp einbindest, wird er nur bei der Übersetzung dieser .cpp durchgenudelt. Wenn du ihn in einen anderen Header einbindest, wird er bei der Übersetzung jeder .cpp, die diesen anderen Header einbindet, wieder von neuem durchgenudelt.
Viele Leute binden viel zu viele Header ein, man sieht vor allem bei Anfängern häufig ein "ich binde in jeden Header mal alles ein". Tatsächlich muss man in Header aber viel weniger einbinden. Du brauchst den Header einer Klasse, wenn du von dieser Klasse ableitest wenn du eine Variable dieser Klasse als Membervariable benutzt, und wenn du eine Variable oder Methoden dieser Klasse in deinen Funktionen benutzt. Wenn du konsequent alle Funktionen in .cpp's implementierst, fällt der letzte Punkt schonmal weg (templates mal ausgenommen, die müssen ja im Header implementiert werden).
Du brauchst keinen Header, wenn du die Klasse für folgendes benutzt:- als Funktionsparameter
- als Funktionsrückgabetyp
- für Referenzen oder Pointer auf Objekte der Klasse
In den Fällen reicht immer eine Forward-Declaration.
DarkBug schrieb:
Das hier ist mehr eine generelle Frage, einen Code gibt es nicht.
Glaube ich dir jetzt nicht mehr. 15 Sekunden Übersetzungszeit ohne Code wären verwunderlich, ebenso braucht man ohne Code auch kein wxWidgets. Zeig uns doch mal deinen 15-Sekunden-Code

-
pumuckl schrieb:
-t 32
Was willst du uns mit diesem Kurzkommentar sagen??
-
Ach sooo. sag das dazu, so völlig aus dem kontext gerissen kann man da wenig mit anfangen.
Das setzt allerdings voraus dass er gmake benutzt. Und dass er genügend Kerne hat, dass sich -j 8 lohnt. Ich nehme mal an, dass er das übliche Einsteiger-Instrument benutzt: VS Express. 2008 oder 2010. Beide parallelisieren meines Wissens sowieso schon automatisch...
-
Ok, solch eine Kompilierungszeit ist also ganz normal und Optimierungen bringen jetzt noch nicht spürbar viel. Somit ist meine Frage beantwortet. Danke für eure Hilfe.
pumuckl schrieb:
DarkBug schrieb:
Das hier ist mehr eine generelle Frage, einen Code gibt es nicht.
Glaube ich dir jetzt nicht mehr. 15 Sekunden Übersetzungszeit ohne Code wären verwunderlich, ebenso braucht man ohne Code auch kein wxWidgets. Zeig uns doch mal deinen 15-Sekunden-Code

xD. Das ist bei wxWidgets Applicationen bei mir immer so. Also unter 15 Sekunden komm ich nicht weg. Normale Konsolenanwendungen hingehen werden in null komma nichts kompiliert.
pumuckl schrieb:
Ach sooo. sag das dazu, so völlig aus dem kontext gerissen kann man da wenig mit anfangen.
Das setzt allerdings voraus dass er gmake benutzt. Und dass er genügend Kerne hat, dass sich -j 8 lohnt. Ich nehme mal an, dass er das übliche Einsteiger-Instrument benutzt: VS Express. 2008 oder 2010. Beide parallelisieren meines Wissens sowieso schon automatisch...Ich benutze den normalen MinGW von www.mingw.org.
-
DarkBug schrieb:
Ich benutze den normalen MinGW von www.mingw.org.
Mit dem Compiler übersetzt du einzelne Übersetzungseinheiten, keine ganzen Projekte. Ich nehme mal an, dass MinGW gmake benutzt, dann müsstest du das entsprechend mit -j <Prozessorzahl> übersetzen.
Die Frage ist dann allerdings auch noch, ob das die Übersetzugnszeiten oder die Linkzeiten sind, die bei dir so lange dauern.
-
g++ wird zum kompilieren und zum linken verwendet. mingw32-make.exe wechselt anscheinend irgendwie die Ordner.
Ich möchte meine Toolchain auch nicht wechseln. Werde mich erstmal damit hingeben.
